Sum*_*Tea 1 cql cassandra cql3
我在 Cassandra 中有一个表定义为
CREATE TABLE foo ("A" text, "B" text, "C" text,
    "D" text, "E" text, "F" text,
    PRMIARY KEY ("A", "B"),
    INDEX ("C"))
我在这个表中插入了数十亿条记录。现在我想用 CQL 查询表
SELECT * FROM foo WHERE "A"='abc' AND "B"='def' AND "C"='ghi'
我一直收到 1200 错误说
ReadTimeout: code=1200 [协调器节点超时等待副本节点的响应] message="操作超时 - 仅收到 0 个响应。info={'received_responses': 0, 'required_responses': 1, 'consistency': 'ONE'}
谷歌搜索后,我怀疑这个错误的原因是查询被定向到一些不包含任何数据的分区。
我的问题是
谢谢!
注意:对于我的示例,我去掉了列名周围的双引号。除了在列名(而不是值)中保留大小写之外,它真的没有做任何事情,只是用来破坏工作。
是否有任何约束查询同时指定主键和辅助键的 CQL?
首先,我需要弄清楚你的“主键”和“次键”究竟是什么。如果您指的C是“辅助密钥”,那么您可以选择“是”,但有一些限制。如果您指的是分区键 ( A) 和集群键 ( B),那么是的,您可以。
通过您的分区和集群键(甚至只是您的分区键)进行查询:
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERe A='abc' AND B='def';
 a   | b   | c   | d   | e   | f
-----+-----+-----+-----+-----+-----
 abc | def | ghi | jkl | mno | pqr
(1 rows)
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERe A='abc';
 a   | b   | c   | d   | e   | f
-----+-----+-----+-----+-----+-----
 abc | ddd | ghi | jkl | mno | pqr
 abc | def | ghi | jkl | mno | pqr
(2 rows)
当我创建您的表和索引时,插入几行,然后运行您的查询:
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERE A='abc' AND B='def' AND C='ghi';
 a   | b   | c   | d   | e   | f
-----+-----+-----+-----+-----+-----
 abc | def | ghi | jkl | mno | pqr
(1 rows)
那个有效。
如果我在我的 CQL 中指定了分区键,这里是“A”='abc'(如果错误请纠正我),为什么 C* 仍然尝试其他显然没有保存数据的分区?
我不相信这是问题所在。您将其限制为单个分区,因此它应该只查询该abc分区之外的数据。
我在这个表中插入了数十亿条记录。
您所看到的是二级索引使用被认为是 Cassandra 中的“反模式”的原因。二级索引的工作方式与它们在关系世界中的工作方式不同。它们只是不能很好地扩展到大型集群或数据集。
解决此超时问题的任何提示?
是的。重新创建您的表C作为第二个集群键。而且也没有创建索引C。
CREATE TABLE foo (A text, B text, C text, D text, E text, F text,
  PRMIARY KEY (A, B, C));
重新加载您的数据,然后这应该适合您:
aploetz@cqlsh:stackoverflow2> SELECT * FROM foo WHERE A='abc' AND B='def' AND C='ghi';
它不仅应该工作,而且不应该超时,而且应该很快。
| 归档时间: | 
 | 
| 查看次数: | 1238 次 | 
| 最近记录: |