? 準備済みステートメント内の変数のスロットを表します。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 を確認してください。