【问题标题】:Cassandra: SELECT ROW by composite keyCassandra:按复合键选择行
【发布时间】:2014-05-26 13:04:17
【问题描述】:

我有一个类似这样的 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 AND 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;

【问题讨论】:

  • 您确定您正在使用此架构吗?您甚至无法在架构中选择 a1 或 a2 。您会收到“错误请求:分区键部分 a2 必须受到限制,因为前一部分是”。请从 cqlsh 粘贴“DESCRIBE table table1”的输出。
  • 我可以选择 ... 其中 a1='a';或选择 ... 其中 a2='g';没问题。描述显示了我的架构和索引。今晚我会贴上。
  • 您还必须有一些索引才能运行这些查询。请将它们添加到帖子中。
  • 取消允许过滤此查询。这可能对你有用。无论如何,请随时通知我们。
  • 它让我使用允许过滤

标签: cassandra cql cql3


【解决方案1】:
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_nametime_bucketpartition 是您的分区键的一部分,因此您需要在您的 WHERE 中包含每一个,以确保 Cassandra 可以找到您的数据的存储位置。

之后的所有列都是聚类列(perf_namevm_namemeasurement_time),它们确定磁盘上数据的排序顺序。同样,您不能选择要包括哪些。您需要按照它们在架构中定义的顺序搜索它们。因此,如果您想通过vm_name 进行查询,那么您还需要确保前面的列键(在这种情况下为perf_name)也存在于您的WHERE 子句中。

基本上要查询此架构,请将ANDs 添加到您的WHERE 子句中:

  • 分区
  • perf_name

【讨论】:

  • 谢谢。虽然我设置了 patition,但我还没有实现它,我的所有分区都是 0。我没有意识到我仍然必须键入它。
猜你喜欢
  • 2012-07-28
  • 2012-12-28
  • 2015-04-04
  • 2013-09-04
  • 2013-12-31
  • 1970-01-01
  • 2019-10-14
  • 2018-05-13
  • 2021-06-07
相关资源
最近更新 更多