如何在cassandra中存储多维数组

时间:2012-08-08 11:32:12

标签: arrays cassandra cql pycassa

我想在cassandra中存储类似数组的对象,但我还需要使用cql访问每个元素,因此我需要构建索引。不幸的是,阵列的大小是动态的(但不是维度的数量,它们是预定义的)。存储数组最合适的方法是:

matrix[x][y][z]

所以,如果它是1维(vector[n])数组,那将非常简单。我想超级列是合适的,比如

{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 ...',
        ...
    }
}

此外,我无法弄清楚如何为此构建索引以及如何为复合比较器创建select语句。

感谢您提出有关我的问题的任何建议,想法或解决方案;)

干杯

1 个答案:

答案 0 :(得分:1)

在Cassandra中,如何存储数据(选择行键和列名)取决于您以后如何访问它。

如果所有坐标都是整数,那么我可以建议你使用a CompositeType(LongType,LongType,LongType)作为列名。

因此,您可以通过将相同的列写入以下键(所有维度的示例)来搜索我将对数据进行非规范化的任何坐标。

  • DynamicCompositeType(x:LongType)
  • DynamicCompositeType(Y:LongType)
  • DynamicCompositeType(z:LongType)
  • DynamicCompositeType(x:LongType,y:LongType)
  • DynamicCompositeType(x:LongType,z:LongType)
  • DynamicCompositeType(y:LongType,z:LongType)

结尾

row [x]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}
行[y]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}
row [z]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}
row [x,y]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}
row [x,z]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}
row [y,z]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}

(所有键都是[x,y,z]的幂集的元素)

如果你认为你总是知道一个点的所有三个坐标,那么你可以在所有维度周围做桶以获得行键。 假设你想要一个64 * 64 * 64的桶用于3D矩阵,你可以保存点[x,y,z]如下:

X =(int)(x / 64),Z =(int)(z / 64),Y =(int)(y / 64)

行[X,Y,Z]
=>专栏[x,y,z]:{“stuff”:“真的吗?” ......}

作为复合材料的替代品,连接字符串工作正常。如果你这样做,不要忘记写前导零,否则如果你指望比较器对列进行整理,列的顺序可能会给你带来问题。

关于数据存储的注意事项

至于存储数据我建议将小的POJO序列化放入一列,如果你想能够使用范围查询恢复元素组,不要每行保存一个元素。 我最喜欢的Cassandra列中使用的序列化方法是Jackson Json to byte或protobuf,如果你可以用它来定义你的所有对象。 远离超级专栏......保持远离!或者使用复合列或动态合成列(如果不是所有列都包含相同的格式和数量的字段)