【发布时间】:2021-06-29 19:19:37
【问题描述】:
Cassandra 数据建模查询 你好,
我正在处理的数据模型如下,相同数据集的不同表用于满足不同类型的查询。数据主要存储一些活动在电子邮件、网络、移动应用、短信等多个渠道发送的事件数据。事件可以包括不同订阅者的页面访问、电子邮件打开、链接点击等。
表 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。每个企业可以有几个活动。数据存储区可能包含数百个活动的数据。每个活动最多可以有 2-3 百万条记录。因此,100 个企业可能有 3000 个分区,每个分区有 2-3 百万条记录。
Cassandra 查询:始终使用分区键 + 主键(包括日期时间字段)进行查询。订阅 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) 的键和数据大小:我仅将分区键作为企业 ID。每个企业可以有几个活动。可能是几百个活动。每个活动最多可以有 2-3 百万条记录。在这种情况下,分区非常大,所有活动的数据都在一个分区中。最多可以有 800 - 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) 的键和数据大小:我将分区键作为企业 ID。每个企业可以有几个活动。可能是几百个活动。每个活动最多可以有 2-3 百万条记录。在这种情况下,分区非常大,所有活动的数据都在一个分区中。最多可以有 800 -9 亿个条目
Cassandra 查询:始终使用分区键 + 主键作为订阅 ID 进行查询。应该可以直接查询enterprise_id + subscription_id。
我的查询:
-
每个分区上的数据大小:使用表 2) 和表 3),我可能最终每个分区有超过 800 -9 亿行。根据我的阅读,每个分区有这么多条目是不行的。在这种情况下,我如何实现我的用例?即使我基于某些数据(例如 week_number(一年中 1-52))创建多个分区,查询也需要跨所有分区进行查询并最终使用包含所有周数的 IN 子句,这与扫描所有数据一样好.
-
是否可以让多个表具有相同的分区键和不同的主键并更改集群顺序?例如,在表 2 和表 3 中,散列将位于 enterprise_id 上,并将导致相同的节点。但是,只有集群键顺序发生了变化,并且允许我直接查询所需的键。在这种情况下,Table2 和 Table3 的数据会在不同的物理分区中吗?或者如果它映射到相同的分区号,cassandra 将如何在内部区分两个表?
-
如果我指定分区键,是否可以使用 ALLOW FILTERING。例如,如果我在表 2 上使用 ALLOW FILTERING,我可以避免创建表 3 并直接使用表 2 来查询 subscription_id。这又会产生什么影响。
【问题讨论】: