我正在寻找创建一个表来存储信息,其中包含一系列网站访问者的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,所以我可以使用这些平台提供的所有工具
答案 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
祝你好运!