卡桑德拉数据建模查询你好,
我正在处理的数据模型如下所示,对于相同的数据集,使用不同的表来满足不同类型的查询。这些数据主要存储通过电子邮件、网络、移动应用、短信等多种渠道发送的一些活动的事件数据。事件可以包括不同用户的页面访问、邮件打开、链接点击等。
表1:
(enterprise_id int, domain_id text, campaign_id int, event_category text, event_action text, datetime timestamp, subscription_id text, event_label text, ........) (many more columns not part of primary key)
PRIMARY KEY ((enterprise_id,campaign_id),domain_id, event_category, event_action, datetime, subscription_id))
CLUSTERING ORDER BY (domain_id DESC, event_category DESC, event_action DESC, datetime DESC, subscription_id DESC)表1的键和数据大小:
我的分区键是enterprise_id + campaign_id。每个企业可以有几个活动。数据存储可能有几百次战役的数据。每一次竞选活动都有高达200万到300万的记录。因此,在100个企业中可能有3000个分区,每个分区都有2-3个记录。
Cassandra查询:查询始终使用分区键+主键,包括datetime字段。订阅id包含在主键中,以保持每个记录的唯一性,因为我们可以有多个记录,其值与主键中其他键的值相似。enterprise_id +c ampaign_id始终可用作查询中的筛选器。
表2:
(enterprise_id int, domain_id text, event_category text, event_action text, datetime timestamp, subscription_id text, event_label text, campaign_id int........) (many more columns not part of primary key)
PRIMARY KEY (enterprise_id, domain_id, event_category, event_action, datetime, subscription_id))
CLUSTERING ORDER BY (domain_id DESC, event_category DESC, event_action DESC, datetime DESC, subscription_id DESC)表2的键和数据大小:我只有分区键作为enterprise_id。每个企业可以有几个活动。可能是几百次战役。每一次战役都有高达2-3百万的记录.在这种情况下,分区非常大,每个分区中的所有活动都有数据。最多可有8亿至9亿个条目
Cassandra查询:查询始终使用分区键+主键直至日期时间。订阅id包含在主键中,以保持每个记录的唯一性,因为我们可以有多个记录,其值与主键中其他键的值相似。在这种情况下,数据必须是跨活动的查询,而且我们在查询中可能没有campaign_id作为筛选器。
表3:
(enterprise_id int, subscription_id text, domain_id text, event_category text, event_action text, datetime timestamp, event_label text, campaign_id int........) (many more columns not part of primary key)
PRIMARY KEY (enterprise_id, subscription_id, domain_id, event_category, event_action, datetime, ))
CLUSTERING ORDER BY ( subscription_id DESC, domain_id DESC, event_category DESC, event_action DESC, datetime DESC,)表3的键和数据大小:我有分区键作为enterprise_id。每个企业可以有几个活动。可能是几百次战役。每一次战役都有高达2-3百万的记录.在这种情况下,分区非常大,每个分区中的所有活动都有数据。最多可有8亿至9亿个条目
Cassandra查询:查询始终使用分区键+主键作为subscription_id。应该能够直接在enterprise_id + subscription_id上查询。
我的问题是:
每个分区上数据的
如果我指定分区键,
发布于 2021-04-04 14:05:57
首先,请每项质询只提出一个问题。考虑到你的答案所需的长度和细节,这篇文章不太可能为未来的用户提供长期的价值。
根据我的阅读,
每个分区有这么多条目是不可能的。如何在这个场景中实现我的用例?
不幸的是,如果时间组件上的分区不能工作,那么您必须找到其他列来对数据进行分区。我见过每行分区工作正常,范围在50k到20k之间。在高端的大多数用例都有较小的分区。看起来您的模型有许多列,所以我会对平均分区大小感到好奇。本质上,找到一个要分区的列,将您的分区大小保持在10 1MB到1MB之间。
是否可以使用具有相同分区键和不同主键的多个表来更改群集顺序?
是的,这很好。
,在这种情况下,Table2和Table3的数据会在不同的物理分区中吗?或者,如果它映射到相同的分区号,那么cassandra如何在内部区分这两个表?
该分区被散列为一个从+/- 2^63不等的数字。然后将该数字与映射到所有节点的分区范围进行比较,然后将查询发送到该节点。因此,分区所做的一切,就是确定哪个节点负责数据。
这些表根据表名将它们的数据文件写入不同的目录。因此,Cassandra根据查询中提供的表名对表进行区分。没什么好担心的。
如果我指定分区键,
是否可以使用允许筛选。
如果你关心性能,我还是建议你不要这么做。但是,在指定完整分区键的同时使用ALLOW FILTERING指令的好处确实会阻止Cassandra读取多个节点来构建结果集。所以这应该没问题。这里唯一的缺点是,Cassandra通过定义的CLUSTERING ORDER从磁盘存储/读取数据,而使用ALLOW FILTERING显然会使进程复杂化(强制随机读取与顺序读取)。
https://stackoverflow.com/questions/66927445
复制相似问题