Cassandra如何在blob字段中过滤十六进制值

时间:2017-03-08 11:26:54

标签: cassandra cql cassandra-3.0

考虑下表:

CREATE TABLE associations (
    someHash blob,
    someValue int,
    someOtherField text
    PRIMARY KEY (someHash, someValue)
) WITH CLUSTERING ORDER BY (someValue ASC);

此表的插入将someHash作为十六进制值,如0xA0000000000000000000000000000001,0xA0000000000000000000000000000002等。

如果查询需要查找0xA0000000000的所有行,那么推荐的Cassandra方法是什么?

2 个答案:

答案 0 :(得分:0)

您的查询的主要问题是它没有考虑Cassandra的限制,即:

  • someHash是分区键列
  • 分区键列[in 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。