首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为同一数据建立多个表的Cassandra数据建模

为同一数据建立多个表的Cassandra数据建模
EN

Stack Overflow用户
提问于 2021-04-03 03:24:14
回答 1查看 230关注 0票数 1

卡桑德拉数据建模查询你好,

我正在处理的数据模型如下所示,对于相同的数据集,使用不同的表来满足不同类型的查询。这些数据主要存储通过电子邮件、网络、移动应用、短信等多种渠道发送的一些活动的事件数据。事件可以包括不同用户的页面访问、邮件打开、链接点击等。

表1:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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:

代码语言:javascript
复制
(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上查询。

我的问题是:

每个分区上数据的

  1. 大小:对于表2和表3),每个分区可能会有超过800-9亿行。根据我的阅读,每个分区有这么多条目是不可能的。如何在这个场景中实现我的用例?即使我基于week_number这样的数据创建多个分区(一年中为1-52),查询也需要跨所有分区进行查询,并最终使用包含所有周号的in子句,这与扫描所有数据一样好。

  1. 是否可以使用具有相同分区键和不同主键的多个表来更改群集顺序?例如,在表2和表3中,散列将位于enterprise_id上,并将导致相同的节点。但是,只有集群密钥顺序发生了更改,并允许我直接查询所需的密钥。在这种情况下,Table2和Table3的数据会在不同的物理分区中吗?或者如果它映射到相同的分区号,那么cassandra如何在内部区分这两个表呢?

如果我指定分区键,

  1. 是否可以使用允许筛选。例如,如果我在表2上使用允许过滤,我可以避免创建表3和直接使用表2对subscription_id查询使用表2。
EN

回答 1

Stack Overflow用户

发布于 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显然会使进程复杂化(强制随机读取与顺序读取)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66927445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档