CqlConfigHelper.setOutputCql()如何工作?

时间:2013-09-24 04:37:27

标签: cassandra cql

我正在关注Cassandra中的hadoop_cql3_word_count示例,并对以下代码段提出疑问:

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

我的问题是:

  1. 上述查询中问号的定义是什么(即?)? Cassandra是否以某种值替换问号来处理它?<​​/ li>
  2. 如果我想在给定密钥的情况下更新一行的多个列,我应该如何修改上述更新语句?
  3. 谢谢,

1 个答案:

答案 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