在 Cassandra 中存储数组
Storing arrays in Cassandra
我有很多 快速传入的数据,它们是这样组织的;
- 许多一维数组,每个逻辑对象一个,其中每个元素在数组中的位置很重要,每个元素都是并行计算和单独生成的,因此不一定按顺序排列。
- 数据数组本身不一定按顺序写入。
- 数组的长度可能会有所不同。
- 一次将数据作为整个数组读取,因此将整个数据存储在一起是有意义的。
在我看来,问题主要是由数据可用于写入的方式引起的。如果它们都可以一起使用,我会同时将整个批次存储在一起并完成它。
对于较小的数据负载,我可以使用 postgres 数组数据类型。每个逻辑对象一行,带有一个键和一个数组列。这允许我通过每个数组一个编写器来扩展,以任何顺序编写元素而不会阻塞任何其他编写器。这受限于单个postgres节点的速率。
在 Cassandra/Scylla 中,我似乎可以选择:
- 将每个元素存储为它自己的行,这对于写入来说会非常快,读取会更麻烦但可行并且可能涉及很多非常宽的扫描,
- 或将数组转换为 json/string,读取单元格,调整值然后重写它,这会非常慢并导致大量压缩开销
- 或者让 writer 缓冲直到它接收到所有数组值,然后一次性写入数组,除非 writer 不知道数组应该有多长并且需要超时来写下它有什么到这个时候,这最终意味着如果出现延迟数据,我将需要在将来的某个时候更新它。
我还有哪些其他选择?
谢谢
选项 1,似乎很合适:
我假设每个逻辑对象都有一个唯一的 id(或更好的 uuid)
在这种情况下,您可以创建类似
CREATE TABLE tbl (id uuid, ord int, v text, PRIMARY KEY (id, ord));
其中 uuid 是分区键,ord 是聚类(排序)键,strong 每个“数组”作为一个分区,每个值作为一行。
这允许
- 使用分页快速检索整个“数组”,即使是一个大数组
- 快速检索数组中的索引
我有很多 快速传入的数据,它们是这样组织的;
- 许多一维数组,每个逻辑对象一个,其中每个元素在数组中的位置很重要,每个元素都是并行计算和单独生成的,因此不一定按顺序排列。
- 数据数组本身不一定按顺序写入。
- 数组的长度可能会有所不同。
- 一次将数据作为整个数组读取,因此将整个数据存储在一起是有意义的。
在我看来,问题主要是由数据可用于写入的方式引起的。如果它们都可以一起使用,我会同时将整个批次存储在一起并完成它。
对于较小的数据负载,我可以使用 postgres 数组数据类型。每个逻辑对象一行,带有一个键和一个数组列。这允许我通过每个数组一个编写器来扩展,以任何顺序编写元素而不会阻塞任何其他编写器。这受限于单个postgres节点的速率。
在 Cassandra/Scylla 中,我似乎可以选择:
- 将每个元素存储为它自己的行,这对于写入来说会非常快,读取会更麻烦但可行并且可能涉及很多非常宽的扫描,
- 或将数组转换为 json/string,读取单元格,调整值然后重写它,这会非常慢并导致大量压缩开销
- 或者让 writer 缓冲直到它接收到所有数组值,然后一次性写入数组,除非 writer 不知道数组应该有多长并且需要超时来写下它有什么到这个时候,这最终意味着如果出现延迟数据,我将需要在将来的某个时候更新它。
我还有哪些其他选择?
谢谢
选项 1,似乎很合适: 我假设每个逻辑对象都有一个唯一的 id(或更好的 uuid) 在这种情况下,您可以创建类似
CREATE TABLE tbl (id uuid, ord int, v text, PRIMARY KEY (id, ord));
其中 uuid 是分区键,ord 是聚类(排序)键,strong 每个“数组”作为一个分区,每个值作为一行。
这允许
- 使用分页快速检索整个“数组”,即使是一个大数组
- 快速检索数组中的索引