2017-03-08 20 views
2

考虑以下表:卡桑德拉如何在blob字段过滤十六进制值

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

当你查询时,你知道someValue的价值吗? –

回答

0

与您的查询的主要问题是,它并没有考虑到卡桑德拉的帐户限制,即:

  • someHash是分区键列
  • 分区键列[在WHERE条款]仅支持两家运营商:=IN(即精确匹配)

换句话说,你的架构设计以这样的方式,有效地查询应该说:“让我们获取所有可能的密钥[FR om所有节点],让我们过滤它们(类型不重要),然后检索与谓词匹配的键的值。这是一个完整的扫描,并不是Cassandra最擅长的。您可以尝试使用UDFs进行一些数据转换(修剪someHash),但我希望它只适用于很少量的数据。

卡桑德拉

金科玉律是“开始查询”:如果你有这样一个用例,模式应该相应地设计 - 您想查询应该是实际的分区键(全someHash值可以是子键集群密钥的一部分)。

顺便说一下,在编程中同样的限制适用于大多数maps:你不能用键的一部分进行查找(因为哈希)。