【问题标题】:Cassandra: best usage of partition and row keyCassandra:分区和行键的最佳使用
【发布时间】:2014-04-24 18:31:17
【问题描述】:

我有以下数据结构:

{
   ClientId: string,
   ItemId: string,
   Item : string
}

我想将此数据存储在 Cassandra 集群中。我知道有些客户端的项目比其他客户端多得多,但我希望将数据均匀地存储在集群的每个节点上,因为我只有一个由 ClientId 和 Item id 组成的查询。

据我所知,我需要指定分区键来均匀分布数据,所以在 CQL 中它看起来像:

CREATE TABLE IF NOT EXISTS mykeyspace.mytable
(
    ClientId text,
    ItemId text,
    Item text,
    PRIMARY KEY((ClientId, Id))
);

我需要指定任何内容作为行键吗? ClientId+ItemId 唯一标识任何行,所以我应该在第一个关闭“)”之后放置任何内容吗?

【问题讨论】:

  • 您的商品 ID 每次都会改变对吧?为什么要将它作为部分分区键。你应该把它放在我觉得的聚类关键部分。
  • 它不是电子商务网站。项目 - 是一大段文字,与购买无关。我想按 clientId 和 ItemId 分区,因为 Item 可能是几兆字节的文本

标签: cassandra


【解决方案1】:

一种方法是对分区键进行哈希处理,然后将哈希用作分区键。

您还可以在其中添加最后一次购买的时间((ClientId, ItemId, lastPurchaseTime))

【讨论】:

  • App 不是关于购买的,但是你能详细说明一下吗?如果 ClientId + ItemId 保证唯一对,我为什么要将时间添加到我的分区键中?它能让我做什么?
  • 您想确保数据分布均匀,因此您可以在购买时添加分区键以帮助更好地分区,通常这些东西只与字节顺序分区器有关。如果您使用随机分区器,您将不必担心太多。
  • 在使用 Murmur3/RandomPartitioner(已经对密钥进行哈希处理)时,无需对主键进行任何哈希处理。主键中的时间戳在这里也没有用。
【解决方案2】:

我需要指定任何内容作为行键吗? ClientId+ItemId 唯一标识任何行,所以我应该在第一个关闭“)”之后放置任何内容吗?

您的示例架构将完全符合您的要求并且运行良好。无需向主键添加任何其他内容。

(如果您向主键添加更多列,它们将用作集群列,控制单个分区的磁盘上行的顺序。)

【讨论】:

    猜你喜欢
    • 2021-11-15
    • 2014-09-24
    • 2017-05-22
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 2017-07-21
    • 2019-04-27
    • 2015-06-21
    相关资源
    最近更新 更多