我有一个类似于这样的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 条款。

基本上要查询此模式,请添加 ANDs到你的 WHERE 条款:

  • 分区/分区
  • 完善名称
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top