Cassandra中的数据建模简单表不起作用

Posted

技术标签:

【中文标题】Cassandra中的数据建模简单表不起作用【英文标题】:Data modeling easy table in Cassandra not working 【发布时间】:2015-12-03 21:56:50 【问题描述】:

我必须设计一个网页,让组长可以邀请人们加入他/她的组。我的要求很简单。

    如果已经联系过此人,则不要发送重复的电子邮件。

    向组长显示按邀请日期升序排列的邀请列表。

看起来很简单。我创建了这张表。

CREATE TABLE invites (
email_address text,
invite_date timeuuid,
PRIMARY KEY (email_address, invite_date)
) WITH CLUSTERING ORDER BY (invite_date ASC);

问题 1:LWT 无法将邀请日期用作集群列。

我想我会使用 LWT 来确保 email_address 是唯一的,只是发现 IF NOT EXISTS 似乎只适用于 whole PRIMARY KEY,所以 C* 中的 LWT 对我不起作用.

问题 2:即使将邀请日期作为集群列,我也无法获得有序的邀请列表以挽救我的生命。

如果我取消邀请日期,我无法在 CQL 中发出“order by”。也就是说,将邀请日期排除在 PK 之外让我使用 LWT...

我什至无法获得一个 2 列的表来满足 2 个简单的要求!非常感谢任何有关此问题的数据建模设计的帮助。

2015 年 12 月 4 日新:

除了业务需求之外,我还有一个技术需求是: 我想确保我在 Cassandra 中正确建模,以便它允许我在 Java 驱动程序中使用 CQL 的 LIMIT 和 pagingState 功能。这意味着,我不能只读取所有行,在 Java 端排序并返回结果。

【问题讨论】:

【参考方案1】:

问题 1: 我认为处理这个问题的最简单方法可能是有两个单独的表,一个用于 emails_in_group,一个用于邀请_by_group。这将允许独立完成每个查询。 emails_in_group 表看起来像这样:

CREATE TABLE emails_in_group ( 
 email_address text,  
 group_id text,
 PRIMARY KEY (email_address , group_id));  

然后,结合下面问题 2 中定义的表格,可以使用条件批处理语句进行更新,如下所示: http://docs.datastax.com/en/cql/3.1/cql/cql_using/use-batch-static.html

问题 2: 因此,这里的基本问题是,当您当前对数据进行建模时,每个 email_address 值都将位于其自己的分区中,然后在该分区中对邀请日期进行排序。当@bydsky 说您需要向表中添加类似 group_id 的内容并将其作为主键的分区键部分时,他是对的。如果您这样做,然后将邀请日期作为集群列添加到分区键,则该 group_id 的所有记录都将存储在同一分区中,并且排序依据将起作用。 Order By 仅适用于同一个分区,而不是跨分区,这是您要求它执行的操作。

CREATE TABLE invites_by_group ( 
 group_id text,  
 email_address text,  
 invite_date timestamp,  
 PRIMARY KEY (group_id, invite_date));   

【讨论】:

【参考方案2】:

我认为你应该使用 group_id 和 email 作为主键。

对于订购,也许您可​​以在您的应用程序中进行。

CREATE TABLE invites ( group_id text,  
email_address text,  
invite_date timestamp,  
PRIMARY KEY (group_id, email_address) );   

对于cassandra数据建模,看DS220是个好开始

【讨论】:

我试过这个。我不能按邀请日期订购,除非它是一个集群列。因此,这是一个 CQL 语法错误:“select * from invites where group_id = 1 order by invite_date;” @Jason 那么也许您可以获取数据并在您的应用程序中对它们进行排序。 我现在正在学习课程,谢谢。 Packt:学习 Apache Cassandra 一书 100% 阅读并摆在我面前。也就是说,我不想在服务器端进行排序,因为这可能意味着读取 WAY 到许多行,只是按“invite_date”排序并将一个子集返回给浏览器。肯定是在寻找一种在 Cassandra 中对此进行建模的方法,以允许我使用它的 LIMIT 和 pagingState 功能。我想我会把它添加到顶部,我想......

以上是关于Cassandra中的数据建模简单表不起作用的主要内容,如果未能解决你的问题,请参考以下文章

cassandra中的Hadoop身份验证不起作用

将存储过程数据插入临时表不起作用

pgadmin 4 导入/导出表不起作用

cassandra 中的数据建模和查询

Cassandra 中的数据建模冲突

「时序数据库」Cassandra时间序列大规模数据建模