Frage

Ich habe ein Cassandra-Schema ähnlich diesem:

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

Dies gilt für Zeitreihendaten.a1 ist meine ID und a2 ist mein Zeitrahmen.
FRAGE:Wie wähle ich einen gesamten Zeitrahmen richtig aus?

Ich kann nach a1 oder a2 auswählen.Aber wenn ich nach a1 UND a2 auswähle, läuft die Anfrage ab.

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

Ergebnis:Die Anfrage wurde nicht innerhalb von rpc_timeout abgeschlossen.

Hier ist mein::

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);

Ich versuche zu:

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

Lösung

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

Das wird nicht funktionieren.Ihr aktueller PRIMARY KEY Ist:

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

Stellen Sie sich die Verwendung eines zusammengesetzten PRIMARY KEY in Cassandra als hierarchischen Pfad vor, beginnend von links nach rechts. dc_name, time_bucket, Und partition sind Teil Ihres Partitionierungsschlüssels, daher müssen Sie jeden davon in Ihren einschließen WHERE um sicherzustellen, dass Cassandra herausfinden kann, wo Ihre Daten gespeichert sind.

Alle Spalten danach sind Clustering-Spalten (perf_name, vm_name, Und measurement_time), die die Sortierreihenfolge Ihrer Daten auf der Festplatte bestimmen.Auch hier können Sie nicht auswählen, welche davon einbezogen werden sollen.Sie müssen sie in der Reihenfolge durchsuchen, in der sie in Ihrem Schema definiert sind.Wenn Sie also nachfragen möchten vm_name, dann müssen Sie auch sicherstellen, dass die vorhergehenden Spaltenschlüssel (perf_name in diesem Fall) sind auch in Ihrem vorhanden WHERE Klausel.

Um dieses Schema abzufragen, fügen Sie im Grunde Folgendes hinzu: ANDs zu dir WHERE Klausel für:

  • Partition
  • perf_name
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top