Cassandra Murmur3Partitioner 行顺序

Cassandra Murmur3Partitioner row order

我有以下 Cassandra table 结构:

CREATE TABLE example.posts (
    name text,
    post_topic text,
    post_date timeuuid,
    post_text text,
    PRIMARY KEY (name, post_topic, post_date)
) WITH CLUSTERING ORDER BY (post_topic ASC, post_date ASC)

我的分区键是 name,集群键是 post_topic, post_date

我需要遍历 table 中的所有元素,所以我执行查询 SELECT * FROM posts 并按如下方式取回数据。

   name | post_topic | post_date                            | post_text
   tom  |  cassandra | 86feab80-710d-11e7-898a-176eb9e01b3a |        hi
   tom  |  cassandra | 8a4dd680-710d-11e7-898a-176eb9e01b3a |       bye
   john |  cassandra | 930ee570-710d-11e7-898a-176eb9e01b3a |  whats up

我正在使用 Murmur3Partitioner。

如果我想循环遍历 table 中的所有元素,并且在这样做时一次在代码 one name 中处理它们,我可以依赖所有行来实现相同的结果吗? name 一个接一个(例如 tom, tom, john,而不是 tom, john, tom?

根据 Cassandra 文档 It is important to understand that the order in which partitioned rows are returned, depends on the order of the hashed token values and not on the key values themselves.

如果我有 2 个生成相同令牌的分区键,那么我是否可能会混淆不同名称的行?也就是说,如果 tom 和 john 生成相同的令牌,我会返回 tom, tom, john 还是会像 tom, john, tom.

一样混淆

不同的名字会产生不同的token,Murmur3Partitioner会确保这一点。

Cassandra 按分区键存储所有数据组。 Cassandra 将像下面这样存储您的数据:

------------------------------------------------------------------------------------------------------------------|
|   tom   |  cassandra : 86feab80-710d-11e7-898a-176eb9e01b3a  | cassandra : 8a4dd680-710d-11e7-898a-176eb9e01b3a |
|         | ---------------------------------------------------|--------------------------------------------------|
|         |                   hi                               |                  bye                             |    
|-----------------------------------------------------------------------------------------------------------------|    
|  john   |  cassandra : 930ee570-710d-11e7-898a-176eb9e01b3a  |
|         |----------------------------------------------------|
|         |                whats up                            |
----------------------------------------------------------------

在cassandra的内部结构中可以看到partition key为top的所有数据都在同一行。 Cassandra 按分区扫描分区,按分区键的令牌排序。

所以cassandra会选择一个分区并且return连续地选择那个分区的所有值。然后下一个分区。 你的情况 "tom, tom, john" 或 "john, tom, tom"

MurmurHash3

The current version is MurmurHash3 which yields a 32-bit or 128-bit hash value. When using 128-bits, the x86 and x64 versions do not produce the same values, as the algorithms are optimized for their respective platforms.

Cassandra 将 return 每个分区键的数据按集群键排序。

在您的案例中,name 的数据将按 post_topicpost_date 排序。

所以数据 returned 可以是 tom,tom,john OR john,tom,tom...但它永远不会是 tom,john,tom...

Murmur3 哈希不会将重复的令牌赋予不同的分区键。

注意:如果 table 很大, Select * from table 可能会导致超时...不确定您的用例...但您可能想看看 spark-cassandra-connector。