我们有一个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中将此查询作为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
命令工作的地方失败了?
答案 0 :(得分: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项目提交一个错误。