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

Cassandra分区密钥组织

党宇定
2023-03-14

我正在尝试将以下结构存储在卡桑德拉中。

ShopID, UserID , FirstName , LastName etc....

上面的大多数查询是

select * from table where  ShopID = ? , UserID = ? 

这就是为什么将(ShopID,UserID)设置为主键很有用的原因。

根据docu,Cassandra的默认分区键是主键的第一列-在我的例子中是ShopID,但我想在Cassandr集群上均匀分布数据,我不能允许一个ShopID中的所有数据只存储在一个分区中,因为有些商店有10M条记录,有些只有1k条记录。

我可以设置(ShopID, UserID)作为分区键,然后我可以达到Cassandra集群中记录的统一分布。但是之后我不能接收属于某个shop id的所有用户

select * 
from table 
where ShopID = ?

很明显,此查询需要对整个群集进行完全扫描,但我没有任何可能这样做。它看起来像是非常硬的约束。

我的问题是如何重新组织数据来同时解决这两个问题(统一的数据分区,进行全扫描查询的可能性)。

共有2个答案

吕寒
2023-03-14

Cassandra 中的每个节点负责一些代币范围。Cassandra 使用哈希从行的分区键派生令牌,并将记录发送到令牌范围包含此令牌的节点。不同的记录可以具有相同的令牌,并且它们分组在分区中。为简单起见,我们可以假设每个 cassandra 节点存储相同数量的分区。我们还希望分区的大小相等,以便在节点之间均匀分布。如果我们的分区太大,这意味着我们的一个节点需要更多的资源来处理它。但是,如果我们将其分解为多个较小的节点,我们就会增加它们在所有节点之间均匀分布的机会。

然而,节点之间令牌范围的分布与分区之间的记录分布无关。当我们添加一个新节点时,它只是承担来自其他节点的令牌范围的偶数部分的责任,结果是偶数个分区。如果我们有2个节点有3 GB的数据,添加第三个节点后,每个节点存储2 GB的数据。这就是为什么可扩展性不受分区的影响,添加新节点后不需要更改历史数据。

岳劲
2023-03-14

一般来说,您需要使用户id成为集群列,并在保存期间向您的表和分区键添加一些人工信息。它允许将一个大的自然分区分解为多个合成。但是现在您需要在读取期间查询所有合成分区以组合回自然分区。所以目标是在合成分区的数量(大小)和读取查询之间找到合理的权衡来组合所有这些分区。

对可能实现的全面描述可以在这里和这里找到(例2:用户组)。

当通过日期类型的聚类列执行查询/排序/分组时,还可以查看解决方案(示例3:按加入日期进行用户分组)。如果您也有类似的查询,这可能很有用。

 类似资料:
  • 我正在学习Cassandra,并有一个关于分区/集群键的问题。 我有一个表,存储数据的股份,如行业的分支,最近6/12个月的业绩,名称等。 该表如下所示: 多谢了,伙计们

  • 是否可以将列作为分区和聚类键?例如, 创建表citylist2(城市varchar,loc list,pop int,zip varchar,state varchar,primary key(city,city,zip)),使用集群顺序BY(城市ASC,zip DESC);

  • 因此,我尝试使用Spark SQL进行以下查询('timestamp'是分区键): 虽然作业产生200个任务,但查询不会返回任何数据。 另外,我可以保证会返回数据,因为在cqlsh上运行查询(使用'token'函数进行适当的转换)确实会返回数据。 但不幸的是我不知道什么是“过滤器”...

  • 参考文献: https://docs.datastax.com/en/cql/3.1/cql/ddl/ddl_compound_keys_c.html Cassandra中分区键、复合键和聚类键的区别?

  • null 火花:1.3 卡桑德拉:2.1 连接器:1.3.1 火花节点(5)和CASS*集群节点(4)运行在不同的数据中心 代码提取。请使用以上链接下载代码以获取更多详细信息 步骤1:将数据加载到8个spark分区中 加载Rdd值

  • 我的主要问题是用复合分区键对表上的Cassandra resultset进行分页。然而,我试图用一个简单的场景来缩小范围。喂,我有桌子, 我有一个数据, 我的模式使用默认的分区器(Murmur3Partitioner)。这是完全可以实现的吗?