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 作业提供所有适当的值。

在 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

于 2013-09-26T18:01:37.407 回答