【问题标题】:How to do Cassandra data modeling for aggregate counts?如何对聚合计数进行 Cassandra 数据建模?
【发布时间】:2016-03-17 14:37:33
【问题描述】:

假设我的服务中有客户订单数据,我想对这些数据进行一些报告。所有客户订单都保存在 Cassandra 表中,以便我可以获取给定客户的所有订单:

TABLE customer_orders

store_id uuid,
customer_id text,
order_id text,
order_amount int,
order_date timestamp,

PRIMARY: KEY (store_id, customer_id)

但我还想找到具有给定订单数量的所有客户。理想情况下,我希望在 Cassandra 中准备好查询表。例如“获取所有有 1 个订单的客户”。

因此我有一个这样的表:

TABLE order_count_to_customer

store_id uuid,
order_count int,
customer_id text

PRIMARY KEY ((store_id, order_count), customer_id)

所以这个想法是当订单到达时,这两个表都要更新。

所以我创建了第三个表:

TABLE customer_to_orders_count

store_id uuid,
customer_id text,
orders_count counter,

PRIMARY KEY (store_id, orders_count)

当订单到达时:

  1. 我保存在第一个表中

  2. 然后更新第三个表中的计数器,增加 1。

  3. 然后我读取第三张表中的计数器,并在第二张表中插入一条新记录。

当我需要查找具有给定数量订单的所有客户时,我只需查询第二个表。

这样做的问题是计数器不是原子的和一致的。如果我将计数器更新为 3,则无法保证当我接下来读取它以更新第二个表时它会是 3。它可能是 2。即使我在更新计数器之前读取了计数器它退后几步可能会有一些价值。所以也不能保证。 请注意,我知道 Cassandra 中计数器的局限性,我并不是在询问如何解决计数器的问题。

我宁愿给出这个例子,以便就如何对数据建模以便能够对其进行聚合计数寻求一些一般性建议。在我的示例中,我当然可以使用 Spark 直接在第一个表上进行聚合查询。但在我看来,可能有一些更聪明的方法可以做到这一点,而且 Spark 也会涉及将整个表数据放入内存。

【问题讨论】:

    标签: cassandra-2.0 datastax spark-cassandra-connector


    【解决方案1】:

    您是否考虑过使用 CQL 批处理命令。 https://docs.datastax.com/en/cql/3.1/cql/cql_reference/batch_r.html

    您可以将它与所有步骤一起使用,以将所有步骤保持在一个逻辑原子事务中,它们要么全部成功,要么全部失败。但是,此功能确实会降低性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多