Question

J'ai un Cassandra schéma similaire à ceci:

CREATE TABLE table1 (a1 text,
  a2 text,
  b1 text,
  b2 text,
  c1 text,
  c2 text,
  PRIMARY KEY ( (a1, a2), b1, b2) )
);

C'est pour les séries chronologiques de données.a1 est mon id et a2 est mon temps seau.
QUESTION:Comment puis-je sélectionner un ensemble de temps seau?

Je peux sélectionner par l'a1 ou a2.Mais si je sélectionne par a1 ET a2, la demande arrive à expiration.

SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;

Résultat:La demande n'est pas complète au sein de rpc_timeout.

Voici mon::

cqlsh:testmulti1> DESCRIBE TABLE datasimple;

CREATE TABLE datasimple (
  dc_name text,
  time_bucket text,
  partition int,
  perf_name text,
  vm_name text,
  measurement_time timestamp,
  perf_data int,
  platform text,
  PRIMARY KEY ((dc_name, time_bucket, partition), perf_name, vm_name, measurement_time)
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.100000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

CREATE INDEX datasimple_dc_name_idx_10 ON datasimple (dc_name);

CREATE INDEX datasimple_time_bucket_idx_10 ON datasimple (time_bucket);

CREATE INDEX datasimple_perf_name_idx_10 ON datasimple (perf_name);

CREATE INDEX datasimple_vm_name_idx_10 ON datasimple (vm_name);

CREATE INDEX datasimple_platform_idx_10 ON datasimple (platform);

Je suis en train de:

SELECT * 
FROM DataSimple 
WHERE dc_name = 'dc1' 
AND time_bucket = '2014031922' 
AND vm_name = 'vm1' LIMIT 1000;
Était-ce utile?

La solution

SELECT * 
FROM DataSimple 
WHERE dc_name = 'dc1' 
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;

Qui ne va pas au travail.Votre PRIMARY KEY est:

PRIMARY KEY ((dc_name, time_bucket, partition),
  perf_name, vm_name, measurement_time)

Essayez de penser à l'aide d'un composé de la CLÉ PRIMAIRE de Cassandra, comme un chemin hiérarchique, à partir de la gauche vers la droite. dc_name, time_bucket, et partition sont une partie de votre partitionnement de la clé, de sorte que vous aurez besoin d'inclure chacun de ces dans votre WHERE pour s'assurer que Cassandra peut trouver l'endroit où vos données sont stockées.

Toutes les colonnes après que sont le clustering colonnes (perf_name, vm_name, et measurement_time), qui permet de déterminer l'ordre de tri de vos données sur le disque.Encore une fois, vous ne pouvez pas choisir lequel de ces inclure.Vous avez besoin de faire une recherche sur eux dans l'ordre qu'ils sont définis dans votre schéma.Donc, si vous voulez de la requête par vm_name, alors vous devez également vous assurer que la colonne précédente clés (perf_name dans le cas présent) sont également présents dans votre WHERE la clause.

Fondamentalement, à la requête de ce schéma, ajouter ANDs à votre WHERE clause pour:

  • partition
  • perf_name
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top