Cassandra数据建模 - 具有日期时间和UTF8Type过滤的动态列

时间:2013-09-08 17:28:49

标签: nosql cassandra cql cql3 pycassa

我正在寻找创建一个表来存储信息,其中包含一系列网站访问者的URL参数的详细信息。我为每个站点获取每个user_id-session_id对的参数和值的字典,每个站点都有一个时间戳。

总结:每个站点都有用户(有会话),其参数有时会包含值。

我想要像这样查询这些数据......

对于每个网站,给定日期范围,获取具有特定参数值的客户的customer_id。

P.S。我没有一个用户ID /会话ID列表,因此我不能在不执行'get_range()'查询的情况下将它们用作行键。这可能很贵。

尝试过的解决方案/想法......

我认为动态列在这里是一个好主意,因为我们并不真正知道所有不同的参数集,我宁愿不尝试对它们进行硬编码。这给了我参数的名称作为列标题和单元格的值作为参数值。这一切都很好,但它留下了复合行键(site,date,customer_id,session_id)。

我都是大复合行键,但我不认为我(希望被纠正)可以通过这种方式查询数据以获得日期范围。如果是的话,我该怎么办呢?

还考虑过使用site-datetime复合列标题,这样我就可以很好地过滤这些属性。然后我可以将行键作为(param - param值)复合键,并将一组user_id构建为值。实际上,这听起来像是我认为最好的选择,但它看起来仍然相当混乱。

如果有人有任何想法,我很乐意听到他们的声音!

谢谢,

马特

p.p.s我正在使用Pycassa,CQL3和Cassandra 1.2,所以我可以使用这些平台提供的所有工具

2 个答案:

答案 0 :(得分:2)

@Kali

所有问题都有适当的解决方案

对于查询,我们有:

  • 网站价值

我们想按日期范围搜索

CREATE TABLE my_index
(
   site text, // row key, also known as partition key
   date timestamp, // search by date range
   user_id bigint, // user id
   session_id uuid, // session id
   parameters map<text,text> // pairs of param key/param value
   PRIMARY KEY (site,date,user_id,session_id)
)

对于每个网站,我们有一行,因为site = row key

列名是( date ,* user_id *,* session_id *)的组合。日期是第一个组件,因此您可以按日期查询。

* user_id *和* session_id *用于保证UNICITY,这意味着对于每个时间戳,您可以存储超过1个user_id / session_id的参数

现在,要存储参数,请使用CQL3引入的MAP功能。参数名称是地图的键,可以存储为文本。对于参数值,因为它们可以是任何类型(long,int,string,date ...),最好将JSON序列化为 text ,这样您就可以将它们一起存储在地图中

此解决方案需要一些序列化/反序列化才能保持/从Cassandra读取

查询示例:

'2013-09-03''2013-09-04'之间获取网站 www.stackoverflow.com 的所有用户,会话和参数

SELECT user_id,session_id,parameters FROM my_index 
WHERE site = 'www.stackoverflow.com' AND date>=1378166400 
AND date<=1378252800

'2013-09-03'和user_id = 10

的日期获取网站 www.stackoverflow.com 的所有参数
SELECT parameters FROM my_index 
WHERE site = 'www.stackoverflow.com' 
AND date=1378166400 AND user_id=10

答案 1 :(得分:0)

cassandra数据建模基于基于查询的方法。

对于cassandra或noSQL数据建模初学者,您的应用程序的数据建模涉及一个过程,例如

1-了解您的数据,设计概念图
2-详细列出您的所有问题 3-使用定义的规则和模式映射您的查询,最适合cassandra
4-创建一个逻辑设计,表格包含从查询中派生的字段 5-现在创建一个模式并测试它的接受程度。

如果我们很好地建模,那么很容易处理诸如新的复杂查询,数据过载,数据一致性设置等问题。

参加此免费在线数据建模培训后,您将获得更多清晰度

https://academy.datastax.com/courses/ds220-data-modeling

祝你好运!