当前位置: 首页 > 知识库问答 >
问题:

同一数据的多表Cassandra数据建模

陈奇希
2023-03-14

表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。每个企业可以有几个活动。datastore可能有几百个活动的数据。每个活动可以有多达200万-300万的记录。因此,在100个企业中可能有3000个分区,每个分区有2-3个miilion记录。

(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)

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个Mn记录。在这种情况下,分区相当大,在一个分区中可以有所有活动的数据。可以有多达8亿-9亿个条目

如果有多个表具有相同的分区键和不同的主键,那么集群顺序改变可以吗?例如,在表2和表3中,哈希将位于enterprise_id上,并将导致相同的节点。但是,只有聚类键顺序发生了变化,允许我直接查询所需的键。在这样的场景中,表2和表3的数据会在不同的物理分区中吗?或者,如果映射到相同的分区号,cassandra将如何在内部区分这两个表?

如果我指定了分区键,是否可以使用允许筛选。例如,如果对表2使用ALLOW FILTERING,就可以避免创建表3,直接使用表2对subscription_id进行查询。又会有什么影响。

共有1个答案

宣望
2023-03-14

首先,请每个问题只作为一个问题。鉴于你的回答所需的长度和细节,这篇文章不太可能为未来的用户提供长期价值。

根据我的阅读,每个分区有这么多条目是不合适的。我如何在这个场景中实现我的用例?

不幸的是,如果在time组件上进行分区不起作用,那么您必须找到其他列来对数据进行分区。我已经看到每个分区的行在50K到20K的范围内工作正常。高端的大多数用例都有小分区。看起来您的模型有很多列,所以我想知道分区的平均大小。基本上,找到一个要分区的列,在该列上保持分区大小在10MB到1MB的范围内。

是的,这完全没问题。

在这样的场景中,表2和表3的数据会在不同的物理分区中吗?或者,如果映射到相同的分区号,cassandra将如何在内部区分这两个表?

分区被散列为+/-2^63之间的数字。然后将该数字与映射到所有节点的分区范围进行比较,然后将查询发送到该节点。所以分区所做的就是确定哪个节点负责数据。

 类似资料:
  • 我目前有一个应用程序,它将事件驱动的实时流数据持久化到一个列系列,该系列建模为: 每个帐户ID每X秒发送一次数据,因此我们每次收到事件时都会覆盖现有行。此数据包含当前实时信息,我们只关心最近的事件(不使用旧数据,这就是我们插入已经存在的键的原因)。从应用程序用户端-我们通过account_id语句查询选择。 我想知道是否有更好的方法来模拟这种行为,并查看了Cassandra的最佳实践和类似的问题(

  • 请针对以下需求对Cassandra表的数据模型给出一些建议/想法。我不确定这是否可以实现。如果可以实现,我们就不需要编写外部程序了 注意:这有助于连接两个Kafka主题和任何更新发生在任何一个Kafka,两者将反映在非ormalized格式在卡桑德拉表 根据我们的要求,任何一个主键的值是相同的,应该向上。未插入。

  • 我是Cassandra数据建模的新手,如果可能的话,我需要在单行中容纳多维数据(是的,我知道Cassandra是柱状存储)。我的示例数据集(试图简化我的用例,忍受我的格式化) 时间戳、交易id、项目代码、用户id、支付方式 20130304221518,abcd,3,6,信用卡 20130304221519,efgh,4,5,现金配送 20130305180402,ijkl,4,5,现金交付 例如

  • 我是Cassandra的新手,正在寻找一个关于如何为具有以下一般结构的数据建模的最佳实践: 对于不同的用户,附加的数据字段不一定相同(字段的名称或这些字段的类型) 示例(csv格式:) 我考虑过的几个选择: null 每个User_id创建Keyspace 每个关键字空间创建表“data” 备注: null null 创建多个keyspaces(例如“x”个keyspaces),每个keyspac

  • 过去几天,我一直在浏览在线文章、视频,甚至是堆叠帖子,以了解如何在cassandra中建模数据。我理解需要根据查询模式对数据进行建模,但我不理解的是cassandra中的列族和列关系,如果这适用于它们,我想查询数据。 我有一个关系数据库表,其中包含以下内容 本质上,它是一个包含客户 ID 及其账户 ID 的表,因此唯一键将cust_id acct_id。每个客户可以有多个 1 个或多个帐户。有一些

  • 我有一个 Cassandra 它有 4 列(项目(文本),市场(文本项目是分区键和市场,位置和时间是相同顺序的聚类键。 应用程序需要在两种情况下查询 Cassandra 表 对于给定的项目,市场和位置通过查询库存表来获取记录。例如,将获取记录下面的项目x、市场l1和位置l1 对于给定的商品、市场和输入时间后的所有位置,通过查询库存表获取记录。例如,项目x,市场m1,将获取t1时间之后低于记录的所有