【问题标题】:How to store a multi-dimensional array in cassandra如何在cassandra中存储多维数组
【发布时间】:2012-08-08 11:32:11
【问题描述】:

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

matrix[x][y][z]

所以,如果它是一维 (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 ...',
        ...
    }
}

此外,我不知道如何为此构建索引以及如何为复合比较器创建选择语句。

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

干杯

【问题讨论】:

    标签: arrays cassandra cql pycassa


    【解决方案1】:

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

    如果所有坐标都是整数,那么我建议您使用 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)

    结束

    行 [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]的幂集的元素)

    如果您认为您将始终知道一个点的所有三个坐标,那么您可以围绕所有维度进行存储桶以获得行键。 假设您想要 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,如果您不介意用它定义所有对象。 远离超级专栏......远离!或者使用复合列或动态复合列(如果不是所有列都包含相同格式和数量的字段)

    【讨论】:

    • 非常感谢...它可以正常工作,索引也可以正常工作。但是一个问题仍然存在,当我使用 cql 来陈述一些查询时,我得到了复合列的未格式化结果。因此,制定 cql 查询,例如: select * from column where x=10 and y=12 ... or where column=(10,12) ... 任何建议
    • 您好,很抱歉现在才看到此评论。我的猜测是,它来自于您将使用动态组合作为键的事实。并非所有人都定义了这两个维度?
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2021-12-05
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多