【问题标题】:Cassandra how to filter hex values in blob fieldCassandra如何过滤blob字段中的十六进制值
【发布时间】:2017-07-28 22:41:39
【问题描述】:

考虑下表:

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

此表的插入具有 someHash 作为十六进制值,例如 0xA0000000000000000000000000000001、0xA00000000000000000000000000000002 等。

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

【问题讨论】:

  • 查询的时候知道someValue的值吗?

标签: cassandra cql cassandra-3.0


【解决方案1】:

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

  • someHash 是一个分区键列
  • [WHERE 子句中] 的分区键列仅支持两个运算符:=IN(即完全匹配)

换句话说,您的架构是这样设计的,有效的查询应该说:“让我们[从所有节点]检索所有可能的键,让我们过滤它们(此处类型不重要),然后检索键的值匹配谓词”。这是某种形式的全面扫描,并不是 Cassandra 最擅长的。您可以尝试使用UDFs 进行一些数据转换(修剪 someHash),但我希望它仅适用于少量数据。

Cassandra 的黄金法则是“查询优先”:如果您有这样的用例,则应该相应地设计架构 - 您要查询的子键应该是实际的分区键(完整someHash 值可以是聚类键的一部分)。

顺便说一句,编程中的大多数maps 都存在同样的限制:您不能通过部分键进行查找(因为散列)。

【讨论】:

    【解决方案2】:

    直接按照您的 0xA0000000000 示例:

    您可以将 someHash 拆分为 48 位(6 字节)和 80 位(10 字节)的部分。

    PRIMARY KEY ((someHash_head, someHash_tail), someValue)
    

    IN 将有 16 个值,从 0xA00000000000 到 0xA0000000000F。

    【讨论】:

      猜你喜欢
      • 2013-03-16
      • 1970-01-01
      • 2019-07-27
      • 2014-01-04
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 2016-08-07
      • 2018-07-26
      相关资源
      最近更新 更多