Cassandra: selezionare la riga per chiave composita
Domanda
Ho uno schema Cassandra simile a questo:
CREATE TABLE table1 (a1 text,
a2 text,
b1 text,
b2 text,
c1 text,
c2 text,
PRIMARY KEY ( (a1, a2), b1, b2) )
);
.
Questo è per i dati della serie temporale.A1 è il mio ID e A2 è il mio secchio del tempo.
DOMANDA: Come seleziona correttamente un intero secchio del tempo?
Posso selezionare A1 o A2.Ma se selezionerò da A1 e A2 le richieste di richiesta.
SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;
.
Risultato: la richiesta non è stata completata all'interno di RPC_Timeout.
Ecco il mio ::
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);
.
Sto cercando di:
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1' LIMIT 1000;
. Soluzione
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;
.
Non funzionerà. Il tuo attuale PRIMARY KEY
è:
PRIMARY KEY ((dc_name, time_bucket, partition),
perf_name, vm_name, measurement_time)
.
Prova a pensare di usare una chiave primaria composta a Cassandra come percorso gerarchico, a partire da sinistra a destra. dc_name
, time_bucket
e partition
sono una parte del tuo tasto di partizionamento, quindi dovrai includere ciascuno di quelli del WHERE
per garantire che Cassandra possa trovare dove vengono memorizzati i dati.
Tutte le colonne dopo le colonne sono le colonne di cluster (perf_name
, vm_name
e measurement_time
), che determinano l'ordinamento dei tuoi dati sul disco. Di nuovo, non puoi scegliere e scegliere quale di questi include. Devi cercare su di loro nell'ordine in cui sono definiti nel tuo schema. Quindi, se si desidera interrogare con vm_name
, è inoltre necessario assicurarsi che i tasti di colonna precedente (perf_name
in questo caso) siano presenti anche nella clausola WHERE
.
Fondamentalmente per interrogare questo schema, aggiungere AND
s alla tua clausola WHERE
per:
- .
- partizione
- perf_name