4

配列のようなオブジェクトを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を使用しています)...

また、複合コンパレータを使用して、すべてを次のような標準の列に配置してみました。

1次元の場合:

{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ステートメントを作成する方法を理解できませんでした。

私の問題に対するあらゆる種類の提案、アイデア、または解決策をありがとう;)

乾杯

4

1 に答える 1

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] : {"もの":"本当に?" ... }
行 [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] の Power Set の要素です)

ポイントの 3 つの座標すべてを常に知っていると思われる場合は、すべてのディメンションのバケットを作成して行キーを取得できます。次のようにポイント[x、y、z]を保存する3Dマトリックスに64 * 64 * 64のバケットが必要だとしましょう:

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

行 [ X, Y, Z]
=> 列 [x,y,z] : {"もの":"本当に?" ... }

コンポジットの代替として、連結された文字列は問題なく機能します。そうしないと、列をソートするためにコンパレーターを当てにしている場合、列の順序が問題になる可能性があります。

データ保存についてのご注意

データの保存に関しては、列にシリアル化された小さな POJO をお勧めします。範囲クエリを使用して要素のグループを復元できるようにする場合は、行ごとに 1 つの要素を保存しないでください。Cassandra コラムで使用する私のお気に入りのシリアル化方法は、Jackson Json から byte または protobuf への変換です。スーパーコラムから離れてください... 離れてください!または、複合列または動的複合列を使用します (すべての列に同じ形式と数のフィールドが含まれているわけではない場合)。

于 2012-08-09T15:00:05.983 に答える