3

我们有一个看起来像这样的 CQL 表:

CREATE table data (
  occurday  text,
  seqnumber int,
  occurtimems bigint,
  unique bigint,

  fields map<text, text>,

  primary key ((occurday, seqnumber), occurtimems, unique)
)

我可以这样查询这个表cqlsh

select * from data where seqnumber = 10 AND occurday = '2013-10-01';

此查询有效并返回预期数据。

但是,如果我在 Pig 中将这个查询作为 a 的一部分执行LOAD,那么事情就不起作用了。

-- Need to URL encode the query
data = LOAD 'cql://ks/data?where_clause=seqnumber%3D10%20AND%20occurday%3D%272013-10-01%27' USING CqlStorage();    

InvalidRequestException(why:seqnumber cannot be restricted by more than one relation if it includes an Equal)
at org.apache.cassandra.thrift.Cassandra$prepare_cql3_query_result.read(Cassandra.java:39567)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_prepare_cql3_query(Cassandra.java:1625)
at org.apache.cassandra.thrift.Cassandra$Client.prepare_cql3_query(Cassandra.java:1611)
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.prepareQuery(CqlPagingRecordReader.java:591)
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.executeQuery(CqlPagingRecordReader.java:621)

这些行为不应该相同吗?为什么通过 Pig 的版本在直接cqlsh命令起作用的地方失败?

4

1 回答 1

2

Hadoop 正在使用CqlPagingRecordReader来尝试加载您的数据。这会导致查询与您输入的内容不同。分页记录读取器尝试一次获取小部分 Cassandra 数据以避免超时。

这意味着您的查询被执行为

SELECT * FROM "data" WHERE token("occurday","seqnumber") > ? AND
token("occurday","seqnumber") <= ? AND occurday='A Great Day' 
AND seqnumber=1 LIMIT 1000 ALLOW FILTERING

这就是为什么您会看到重复的关键错误。我将向 Cassandra 项目提交一个错误。

吉拉: https ://issues.apache.org/jira/browse/CASSANDRA-6151

于 2013-10-06T17:11:27.953 回答