Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在cassandra中存储多维数组_Arrays_Cassandra_Cql_Pycassa - Fatal编程技术网

Arrays 如何在cassandra中存储多维数组

Arrays 如何在cassandra中存储多维数组,arrays,cassandra,cql,pycassa,Arrays,Cassandra,Cql,Pycassa,我想在cassandra中存储类似数组的对象,但我还需要使用cql访问每个元素,因此我需要构建索引。不幸的是,数组的大小是动态的(但不是维度的数量,它们是预定义的)。存储数组最合适的方法是什么,如: 矩阵[x][y][z] 因此,如果它是一个一维(vector[n])数组,它将非常简单。我想超级专栏是合适的,比如 {key=1000 , { 'matrix[]' : { key=0, {value:10), key=1, {value:3

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

矩阵[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),
        }
    }
}
但在这两种情况下,我都不知道如何定义列验证类(我使用的是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语句

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


Cheers

在Cassandra中,存储数据的方式(选择行键和列名)取决于您以后希望如何访问数据

如果所有坐标都是整数,那么我建议你使用 复合类型(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]:{“东西”:“真的吗?”…}
行[y]
=>列[x,y,z]:{“东西”:“真的吗?”…}
行[z]
=>列[x,y,z]:{“东西”:“真的吗?”…}
行[x,y]
=>列[x,y,z]:{“东西”:“真的吗?”…}
行[x,z]
=>列[x,y,z]:{“东西”:“真的吗?”…}
行[y,z]
=>列[x,y,z]:{“东西”:“真的吗?”…}

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

如果您认为您将始终知道一个点的所有三个坐标,那么您可以围绕所有维度执行桶操作以获得行键。 假设您希望3D矩阵的存储桶为64*64*64,则将点[x,y,z]保存如下:

其中X=(int)(X/64)、Z=(int)(Z/64)和Y=(int)(Y/64)

行[X,Y,Z]
=>列[x,y,z]:{“东西”:“真的吗?”…}

作为复合的替代方案,串联字符串可以很好地工作。如果这样做,请不要忘记写入前导零,否则,如果您指望比较器对列进行排序,列的顺序可能会给您带来问题

关于数据存储的说明

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

非常感谢。。。它很有效,索引也很有效。但有一个问题仍然存在,当我使用cql来表示一些查询时,我会得到合成列的未匹配结果。因此,制定cql查询,如:从x=10和y=12的列中选择*。。。或其中列=(10,12)。。。任何建议我很抱歉现在才看到这个评论。我的猜测是,它来自这样一个事实,即您将使用动态复合材料作为关键点。不是所有人都定义了这两个维度吗?