我想在 cassandra 中存储类似数组的对象,但我还需要使用 cql 访问每个元素,因此我需要构建索引。不幸的是,数组的大小是动态的(但不是维数,它们是预定义的)。存储数组的最合适方法是什么:matrix[x][y][z]
因此,如果它是一维( vector[n]
)数组,那将非常简单。我想 super 列是合适的,比如
{key=1000 ,
{ 'matrix[]' : {
key=0, {value:10),
key=1, {value:33),
...
key=n, {value:x)
}
}
}`
多维数组(
matrix[x][y][z]
)有点复杂,我会将它们存储为:{key=1000,
{ 'matrix[ ][ ][ ]' :
{
key=0, {x=0, y=0, z=0, value:10),
key=1, {x=0, y=0, z=1, value:33),
...
key=whatever, {x=m, y=n, z=o, value:10),
}
}
}
但在这两种情况下,我都无法弄清楚如何定义 column_validation_classes(我使用的是 pycassa)......
我还尝试使用复合比较器,并将所有内容放在标准列中,例如:
对于一维:
{key=1000,
{
('matrix[ ]', 0) : 10,
('matrix[ ]', 1) : 33,
...
('matrix[ ]', n) : x
}
}
或多个维度:
{key=1000,
{
('matrix[ ][ ][ ]', 0,0,0) : 10,
('matrix[ ][ ][ ]', 0,0,1) : 33,
...
('matrix[ ][ ][ ]', m,n,o) : 10
}
}
但是对于这种情况,如果我想添加具有其他信息的其他列,我不知道如何适本地定义比较器:
{key=1000,
{
('matrix[ ][ ][ ]', 0,0,0) : 10,
...
('matrix[ ][ ][ ]', m,n,o) : 10,
'whatever' : 'who cares ...',
...
}
}
此外,我无法弄清楚如何为此构建索引以及如何为复合比较器创建选择语句。
感谢您对我的问题提出任何建议、想法或解决方案;)
干杯
最佳答案
在 Cassandra 中,您存储数据的方式(选择行键和列名)取决于您以后希望如何访问它。
如果所有坐标都是整数,那么我可以建议您使用
CompositeType(LongType, LongType, LongType) 作为列名。
这样您就可以通过任何坐标进行搜索,我将通过将同一列写入以下键来对数据进行非规范化(所有维度的示例)
结束了
行 [x]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
行 [y]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
行 [z]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
行 [x,y]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
行 [x,z]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
行 [y,z]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
(所有键都是 [x, y, z] 幂集的元素)
如果你认为你总是知道一个点的所有三个坐标,那么你可以在所有维度上做桶来获取行键。
假设您想要为 3D 矩阵使用 64*64*64 的桶,您可以按如下方式保存点 [x, y, z]:
X = (int) (x/64), Z = (int) (z/64), and Y = (int) (y/64)
行 [ X, Y, Z]
=> 列 [x,y,z] : {"stuff":"真的吗?"... }
作为复合的替代方案,连接字符串工作得很好。如果您这样做,请不要忘记写前导零,否则如果您指望比较器对列进行排序,列的顺序可能会给您带来问题。
数据存储注意事项
至于存储数据,我建议将小型 POJO 序列化放入列中,如果您希望能够使用范围查询恢复元素组,请不要每行保存一个元素。
我最喜欢在 Cassandra 列中使用的序列化方法是 Jackson Json 到 byte 或 protobuf,如果您可以用它来定义所有对象。
远离 super 专栏......远离!或者使用复合列或动态复合列(如果不是所有列都包含相同的格式和字段数量)
关于arrays - 如何在cassandra中存储多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11863595/