这 ?表示准备好的语句中变量的槽。当您的 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 作业提供所有适当的值。
在 WC 示例中
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
有关一般准备好的语句的更多信息,请查看
关于 CQL 中的准备好的语句的 SO Question