use*_*774 2 cql cassandra cql3
我有一个与此类似的 Cassandra 架构:
CREATE TABLE table1 (a1 text,
a2 text,
b1 text,
b2 text,
c1 text,
c2 text,
PRIMARY KEY ( (a1, a2), b1, b2) )
);
Run Code Online (Sandbox Code Playgroud)
这是针对时间序列数据的。a1 是我的 id,a2 是我的时间段。
问题:如何正确选择整个时间段?
我可以选择 a1 或 a2。但是如果我选择 a1 AND a2 请求超时。
SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;
Run Code Online (Sandbox Code Playgroud)
结果:请求未在 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);
Run Code Online (Sandbox Code Playgroud)
我在尝试着:
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1' LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)
那是行不通的。你的电流PRIMARY KEY是:
PRIMARY KEY ((dc_name, time_bucket, partition),
perf_name, vm_name, measurement_time)
Run Code Online (Sandbox Code Playgroud)
尝试将 Cassandra 中的复合 PRIMARY KEY 视为分层路径,从左到右开始。 dc_name, time_bucket, 和partition是分区键的一部分,因此您需要将其中的每一个都包含在内,WHERE以确保 Cassandra 可以找到存储数据的位置。
之后的所有列都是聚类列(perf_name、vm_name和measurement_time),它们决定了磁盘上数据的排序顺序。同样,您无法选择要包含其中的哪些。您需要按照它们在您的架构中定义的顺序搜索它们。因此,如果您想查询 by vm_name,那么您还需要确保前面的列键(perf_name在本例中)也存在于您的WHERE子句中。
基本上要查询此架构,请将ANDs添加到您的WHERE子句中:
| 归档时间: |
|
| 查看次数: |
2217 次 |
| 最近记录: |