カサンドラ:複合キーによるSELECT ROW
質問
これに似た Cassandra スキーマがあります。
CREATE TABLE table1 (a1 text,
a2 text,
b1 text,
b2 text,
c1 text,
c2 text,
PRIMARY KEY ( (a1, a2), b1, b2) )
);
これは時系列データ用です。a1 は私の ID で、a2 は私のタイムバケットです。
質問:タイム バケット全体を適切に選択するにはどうすればよいですか?
a1またはa2で選択できます。しかし、a1 と a2 で選択すると、リクエストはタイムアウトになります。
SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;
結果:リクエストは rpc_timeout 以内に完了しませんでした。
これが私のものです::
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);
私は。。をしようとしています:
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1' LIMIT 1000;
解決
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;
それはうまくいきません。あなたの現在 PRIMARY KEY
は:
PRIMARY KEY ((dc_name, time_bucket, partition),
perf_name, vm_name, measurement_time)
Cassandra で複合 PRIMARY KEY を左から右への階層パスとして使用することを考えてみてください。 dc_name
, time_bucket
, 、 そして partition
はパーティション化キーの一部であるため、それらのそれぞれを WHERE
Cassandra がデータの保存場所を確実に見つけられるようにするためです。
それ以降の列はすべてクラスタリング列です (perf_name
, vm_name
, 、 そして measurement_time
)、ディスク上のデータの並べ替え順序を決定します。繰り返しになりますが、これらのどれを含めるかを選択することはできません。スキーマで定義されている順序で検索する必要があります。したがって、クエリを実行したい場合は、 vm_name
, の場合、前の列のキー (perf_name
この場合) はあなたのファイルにも存在します WHERE
句。
基本的にこのスキーマをクエリするには、次を追加します AND
あなたへ WHERE
以下の条項:
- パーティション
- パフォーマンス名
所属していません StackOverflow