3

我按照这里的示例:https ://github.com/apache/cassandra/blob/trunk/examples/hadoop_cql3_word_count/src/WordCount.java编写我自己的 MR 作业,该作业从表 A 中读取数据并将相同的数据写入表中B. 表 A 和 B 都存储在 Cassandra,DataStax 版本中。

我的 MR 工作读取所有数据没有问题,我也可以写入 HDFS,但是当我尝试写回表 B 时,它会抛出错误:

attempt_201311051600_0300_r_000000_2: java.io.IOException: InvalidRequestException(why:there were 2 markers(?) in CQL but 3 bound variables)
attempt_201311051600_0300_r_000000_2:   at org.apache.cassandra.hadoop.cql3.CqlRecordWriter$RangeClient.run(CqlRecordWriter.java:248)
attempt_201311051600_0300_r_000000_2: Caused by: InvalidRequestException(why:there were 2 markers(?) in CQL but 3 bound variables)
attempt_201311051600_0300_r_000000_2:   at org.apache.cassandra.thrift.Cassandra$execute_prepared_cql3_query_result.read(Cassandra.java:41868)
attempt_201311051600_0300_r_000000_2:   at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
attempt_201311051600_0300_r_000000_2:   at org.apache.cassandra.thrift.Cassandra$Client.recv_execute_prepared_cql3_query(Cassandra.java:1689)
attempt_201311051600_0300_r_000000_2:   at org.apache.cassandra.thrift.Cassandra$Client.execute_prepared_cql3_query(Cassandra.java:1674)
attempt_201311051600_0300_r_000000_2:   at org.apache.cassandra.hadoop.cql3.CqlRecordWriter$RangeClient.run(CqlRecordWriter.java:232)

我的准备声明是:

String query = "UPDATE " + KEYSPACE + "." + OUT_COLUMN_FAMILY + " SET amt=?, good_desc='?' ";
CqlConfigHelper.setOutputCql(job.getConfiguration(), query);

我之前尝试在reducer中打印出List context.write(keys, variables);(变量是List),它实际上只包含2个值,例如:

INFO  - 2013-11-07 15:43:36.683; poc.cassandra.mr.access.CassandraReducer; --> tx_id: 2577620422:10001372:debit
INFO  - 2013-11-07 15:43:36.684; poc.cassandra.mr.access.CassandraReducer; 0: 12919
INFO  - 2013-11-07 15:43:36.684; poc.cassandra.mr.access.CassandraReducer; 1: Express
4

1 回答 1

0

这意味着您试图将 3 个参数传递给准备好的语句,而您只有两个“?” 占位符。因此,您传递的参数多于准备好的占位符。不幸的是,命名参数也会发生这种情况(他们可以简单地忽略不匹配的参数,这有时会非常方便)。

于 2017-11-02T15:30:29.237 回答