考虑下表:
CREATE TABLE associations (
someHash blob,
someValue int,
someOtherField text
PRIMARY KEY (someHash, someValue)
) WITH CLUSTERING ORDER BY (someValue ASC);
此表的插入将someHash作为十六进制值,如0xA0000000000000000000000000000001,0xA0000000000000000000000000000002等。
如果查询需要查找0xA0000000000的所有行,那么推荐的Cassandra方法是什么?
答案 0 :(得分:0)
您的查询的主要问题是它没有考虑Cassandra的限制,即:
WHERE
子句]仅支持两个运算符:=
和IN
(即完全匹配)换句话说,你的架构是以这样的方式设计的,有效的查询应该说:“让我们检索[来自所有节点]的所有可能的密钥,让我们过滤它们(这里类型不重要),然后检索密钥的值匹配谓词“。这是某种类型的全扫描,而不是Cassandra最擅长的。您可以尝试使用UDFs进行一些数据转换(修剪someHash),但我希望它只能处理大量数据。
Cassandra的黄金法则是“查询第一”:如果你有这样的用例,应该相应地设计架构 - 你要查询的子键应该是实际的分区键(完整的) someHash值可以是聚类键的一部分。)
BTW,同样的限制适用于编程中的大多数maps
:你不能通过密钥的一部分进行查找(因为散列)。
答案 1 :(得分:0)
直接遵循您的0xA0000000000示例:
您可以将一些哈希分解为48位(6字节)和80位(10字节)的部分。
PRIMARY KEY ((someHash_head, someHash_tail), someValue)
然后,IN将具有16个值,从0xA00000000000到0xA0000000000F。