2

Cassandra のhadoop_cql3_word_countの例に従っていますが、次のコード セグメントについて質問があります。

    String query =
        "UPDATE " + KEYSPACE + "." + OUTPUT_COLUMN_FAMILY +
        " SET count_num = ? ";
    CqlConfigHelper.setOutputCql(job.getConfiguration(), query);

私の質問は次のとおりです。

  1. ?上記のクエリの疑問符 (つまり、) の定義は何ですか? Cassandra は、疑問符が何らかの値に置き換えられるような方法で処理しますか?
  2. キーを指定して行の複数の列を更新したい場合、上記の更新ステートメントをどのように変更すればよいですか?

ありがとうございました、

4

1 に答える 1

1

? 準備済みステートメント内の変数のスロットを表します。MR ジョブが完了すると、値が順番に ?s に配置されます。

MR の結果が (key=key1, 1) (key=key2, 2) (key=key3, 3) の場合

次に、実行されるステートメントは次のようになります

Update Keyspace.columnfamily SET count_num = 1 where key=key1
Update Keyspace.columnfamily SET count_num = 2 where key=key2
Update Keyspace.columnfamily SET count_num = 3 where key=key3

複数の列を更新するには、より大きな準備済みステートメントを記述し、map reduce ジョブが適切な値をすべて提供していることを確認するだけです。

トイレの例では

    keys.put("row_id1", ByteBufferUtil.bytes(partitionKeys[0]));
    keys.put("row_id2", ByteBufferUtil.bytes(partitionKeys[1]));
    ...
    keys.put("word", ByteBufferUtil.bytes(word.toString()));
    variables.add(ByteBufferUtil.bytes(String.valueOf(sum)));         

    ...
    context.write(keys, getBindVariables(word, sum));

これにより、リデューサーの出力は次のようになります ({row_id1=1,row_id2=3,word=pizza},4)

そして、準備されたステートメントは次のように実行されます

UPDATE cql3_worldcount.output_words SET count_num = 4 where row_id1=1 AND row_id2=3 AND word=pizza ;

複数の列を持つ準備済みステートメントが必要な場合は、次のようになります

UPDATE test SET a =?,b=?,c=?,d=? (This gets filled in by the connector: where key=...)

実際の準備されたステートメントでは、キーも入力しますが、ここでは、Cassandra へのコネクタは、リデューサー出力にあるマッピングをそのまま使用します。

({key='mykey'},(1,2,3,4))
becomes
UPDATE test SET a =1,b=2,c=3,d=4 where key=mykey

一般的な準備済みステートメントの詳細については、 SO Question about Prepared Statements in CQL を確認してください。

于 2013-09-26T18:01:37.407 に答える