【问题标题】:Storing arrays in Cassandra在 Cassandra 中存储数组
【发布时间】:2021-12-05 13:21:56
【问题描述】:

我有大量如此组织的快速传入数据;

  • 大量一维数组,每个逻辑对象一个,其中数组中每个元素的位置很重要,每个元素都是并行计算和生成的,因此不一定按顺序排列。
  • 数据数组本身不一定按顺序写入。
  • 数组的长度可能不同。
  • 数据要么一次作为整个数组读取,因此将整个数据存储在一起是有意义的。

在我看来,问题主要是由数据可用于写入的方式引起的。如果它们都可以一起使用,我会同时将整个批次存储在一起并完成它。

对于较小的数据负载,我可以使用 postgres 数组数据类型。每个逻辑对象一行,带有一个键和一个数组列。这允许我通过每个数组有一个写入器来扩展,以任何顺序写入元素而不会阻塞任何其他写入器。这受限于单个 postgres 节点的速率。

在 Cassandra/Scylla 中,我似乎有以下两种选择:

  1. 将每个元素存储为自己的行,这样写入速度会非常快,读取会更麻烦但可行,并且可能涉及大量非常宽的扫描,
  2. 或将数组转换为 json/string、读取单元格、调整值然后重写它,这将非常缓慢并导致大量压缩开销
  3. 或者让写入器缓冲区直到它接收到所有数组值,然后一次性写入数组,除非写入器不知道数组应该有多长,并且需要超时来写下它所拥有的任何内容时间,这最终意味着如果出现迟到的数据,我将需要在将来的某个时间对其进行更新。

我还有什么其他选择?

谢谢

【问题讨论】:

    标签: cassandra scylla


    【解决方案1】:

    选项 1,似乎是一个很好的匹配: 我假设每个逻辑对象都有一个唯一的 id(或更好的 uuid) 在这种情况下,您可以创建类似

    CREATE TABLE tbl (id uuid, ord int, v text, PRIMARY KEY (id, ord));
    

    其中 uuid 是分区键,ord 是聚类(排序)键,将每个“数组”作为一个分区,将每个值作为一行。

    这允许

    • 使用分页快速检索整个“数组”,甚至是一个大数组
    • 快速检索数组中的索引

    【讨论】:

    • 将订单存储为int 的挑战在于,当新条目进入时,您必须不断重写分区。它还需要有条件的 read-before-write 才能获得当前值然后设置它。另请注意,@Blootac 表示元素是并行计算的,因此在编写时不按顺序排列。干杯!
    • 感谢@ErickRamirez。第二点是有效的。不确定我得到第一个,“重写”只发生在压缩中。在任何时候,整个分区都不会按原样存储在一个地方。
    • @ErickRamirez 实际上,这不是问题。假设元素是按 3,1,2 的顺序计算的,我们在写入数据之前就知道数据在数组中的位置,所以它实际上只是将其存储在位置 3。它不像队列或向量,其中我们必须插入东西并回填空白。允许并处理阵列中的间隙或空位。正如 Tzach Livyatan 所建议的那样,选项 1 将起作用,具有共享分区 ID 可将所有元素保持在同一位置。只是想检查一下我没有遗漏任何明显的模式。
    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多