题
我有一个类似于这样的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中的复合主键视为分层路径,从左到右开始。 dc_name
, time_bucket
, ,而 partition
是分区密钥的一部分,所以你需要在你的 WHERE
以确保Cassandra能够找到您的数据存储位置。
之后的所有列都是聚类列(perf_name
, vm_name
, ,而 measurement_time
),它决定了磁盘上数据的排序顺序。同样,您无法选择要包含的内容。您需要按照它们在架构中定义的顺序搜索它们。所以如果你想查询 vm_name
, ,那么你还需要确保前面的列键(perf_name
在这种情况下)也存在于您的 WHERE
条款。
基本上要查询此模式,请添加 AND
s到你的 WHERE
条款:
- 分区/分区
- 完善名称
不隶属于 StackOverflow