我有以下Cassandra表结构:
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
。
我需要循环遍历表中的所有元素,以便执行查询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。
如果我想循环遍历表中的所有元素,并且我一次在代码一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, tom, john
或者它可能会像tom, john, tom
那样混淆。
答案 0 :(得分:0)
不同的名称会生成不同的令牌,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内部结构的同一行中。 Cassandra按分区扫描分区,按分区键的标记排序。
所以cassandra会选择一个parition并连续返回该分区的所有值。然后下一个分区。 在你的情况下要么" tom,tom,john"或者"约翰,汤姆,汤姆"
答案 1 :(得分:0)
MurmurHash3
当前版本是MurmurHash3,它产生32位 或128位哈希值。使用128位时,x86和x64版本 不会生成相同的值,因为算法已经过优化 他们各自的平台。
Cassandra将返回按群集键排序的每个分区键的数据。
在您的情况下,name
的数据将由post_topic
和post_date
订购。
所以返回的数据可以是tom,tom,john OR john,tom,tom
......但它永远不会是汤姆,约翰,汤姆......
Murmur3哈希不会将重复令牌提供给不同的分区键。
注意: Select * from table
如果表格很大,可能会导致超时...不确定您的用例......但您可能希望看看spark-cassandra-连接器。