13

これが私が直面しているシナリオのサンプルです。この列ファミリーがあるとします。

    create column family CompositeTypeCF 
    with comparator = 'CompositeType(IntegerType,UTF8Type)' 
    and key_validation_class = 'UTF8Type' 
    and default_validation_class = 'UTF8Type'

この列ファミリーにデータを挿入する方法について、Hector を使用したサンプル Java コードを次に示します。

 Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160");
 Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster);
 Composite colKey1 = new Composite();
 colKey1.addComponent(1, IntegerSerializer.get());
 colKey1.addComponent("test1", StringSerializer.get());
 Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
 Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF",
     HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get()));
 mutator.execute();

これは機能し、cassandra-cli に移動してリストを作成すると、次のようになります。

$ list CompositeTypeCF;

Using default limit of 100
-------------------
RowKey: rowkey1
=> (column=1:test1, value=Some Data, timestamp=1326916937547000)

私の質問はこれです: Hector でこのデータを照会するにはどうすればよいですか? 基本的に、いくつかの方法でクエリを実行する必要があります。

  1. Row Key = "rowkey1" の行全体を教えてください
  2. 列名の最初の部分が整数値である列データを教えてください
  3. 列名の最初の部分が特定の範囲内にある列をすべて教えてください
4

1 に答える 1

13

良い出発点のチュートリアルはこちら.

しかし、最終的に複合コンポーネントを使用する必要が生じ、データに対するクエリを作成しようとした後、共有したいことがいくつかわかりました。

複合列を検索すると、結果は列の連続したブロックになります。

したがって、3 つの文字列の合成と仮定すると、私の列は次のようになります。

A:A:A
A:B:B
A:B:C
A:C:B
B:A:A
B:B:A
B:B:B
C:A:B

A:A:A から B:B:B までの検索の場合、結果は次のようになります。

A:A:A
A:B:B
A:B:C
A:C:B
B:A:A
B:B:A
B:B:B

「C」コンポーネントに注目してください。開始/終了用語に「C」コンポーネントはありません! 何が与えますか?これらは、A:A:A 列と B:B:B 列の間のすべての結果です。複合検索用語は、ネストされたループを処理するかのように結果を提供しません(これは私が最初に考えたものです)。むしろ、列がソートされているため、列の連続ブロックの開始語と終了語を指定しています

Composite 検索エントリを作成するときは、ComponentEquality を指定する必要があります。

最後の用語のみを GREATER_THAN_EQUAL にする必要があり、その他はすべて EQUAL にする必要があります。たとえば上記の場合

Composite start = new Composite();
start.addComponent(0, "A", Composite.ComponentEquality.EQUAL);
start.addComponent(1, "A", Composite.ComponentEquality.EQUAL);
start.addComponent(2, "A", Composite.ComponentEquality.EQUAL);

Composite end = new Composite();
end.addComponent(0, "B", Composite.ComponentEquality.EQUAL);
end.addComponent(1, "B", Composite.ComponentEquality.EQUAL);
end.addComponent(2, "B", Composite.ComponentEquality.GREATER_THAN_EQUAL);

SliceQuery<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se);
sliceQuery.setColumnFamily("CF").setKey(myKey);
ColumnSliceIterator<String, Composite, String> csIterator = new ColumnSliceIterator<String, Composite, String>(sliceQuery, start, end, false);

while (csIterator.hasNext()) ....
于 2012-01-19T18:15:52.573 に答える