我正在关注Cassandra中的hadoop_cql3_word_count示例,并对以下代码段提出疑问:
String query =
"UPDATE " + KEYSPACE + "." + OUTPUT_COLUMN_FAMILY +
" SET count_num = ? ";
CqlConfigHelper.setOutputCql(job.getConfiguration(), query);
我的问题是:
?
)? Cassandra是否以某种值替换问号来处理它?</ li>
谢谢,
答案 0 :(得分:1)
?表示预准备语句中变量的槽。当您的MR作业完成后,值将按顺序放入?。
如果您的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));
这使得reducer输出看起来像 ({row_id1 = 1,row_id2 = 3,字=比萨饼},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的连接器只会使用你在reducer输出中的任何映射。
({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