我基本上遇到与以下Composite key in Cassandra with Pig相同的问题。唯一的区别是我尝试在pig的where_clause中查询复合键的一部分。
数据结构类似于前面提到的问题,我会复制一些代码/上下文,以尽量减少对该问题的阅读。
我们有一个CQL表,看起来像这样:
CREATE table data (
occurday text,
seqnumber int,
occurtimems bigint,
unique bigint,
fields map<text, text>,
primary key ((occurday, seqnumber), occurtimems, unique)
)
我没有查询seqnumber和发生日(就像前面提到的问题一样),而是尝试查询其中一个键。
如果我在Pig中执行此查询作为LOAD的一部分,那么事情就不起作用。
-- Need to URL encode the query
data = LOAD 'cql://ks/data?where_clause=occurday%3D%272013-10-01%27' USING CqlStorage();
给出
java.lang.RuntimeException
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.executeQuery(CqlPagingRecordReader.java:665)
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.<init>(CqlPagingRecordReader.java:301)
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader.initialize(CqlPagingRecordReader.java:167)
at org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.PigRecordReader.initialize(PigRecordReader.java:181)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.initialize(MapTask.java:522)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:763)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
Caused by: InvalidRequestException(why:occurday cannot be restricted by more than one relation if it includes an Equal)
at org.apache.cassandra.thrift.Cassandra$prepare_cql3_query_result$prepare_cql3_query_resultStandardScheme.read(Cassandra.java:51017)
at org.apache.cassandra.thrift.Cassandra$prepare_cql3_query_result$prepare_cql3_query_resultStandardScheme.read(Cassandra.java:50994)
at org.apache.cassandra.thrift.Cassandra$prepare_cql3_query_result.read(Cassandra.java:50933)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.cassandra.thrift.Cassandra$Client.recv_prepare_cql3_query(Cassandra.java:1756)
at org.apache.cassandra.thrift.Cassandra$Client.prepare_cql3_query(Cassandra.java:1742)
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.prepareQuery(CqlPagingRecordReader.java:605)
at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.executeQuery(CqlPagingRecordReader.java:635)
... 7 more
基本上我的问题是,我做错了什么或者我不理解什么?
据我所知CqlPagingRecorderReader Used when Partition Key Is Explicitly Stated 我应该能够只使用部分分区密钥进行查询?
同时阅读 Add CqlRecordReader to take advantage of native CQL pagination 我得到的印象应该是可能的,但我正在游泳(在我看来)没有明确指示如何实现这一目标。
此时非常欢迎任何帮助。
此致
Lennart Weijl
PS。
我使用Pig 0.13.0运行Cassandra 2.0.9
答案 0 :(得分:0)
根据CASSANDRA-6311,我认为你需要应用6331-v2-2.0-branch.txt补丁,重新编译猪,然后将你的LOAD语句更新为:
data = LOAD 'cql://ks/data?where_clause=occurday%3D%272013-10-01%27' USING CqlInputFormat();
密钥更改为USING CqlInputFormat()
,触发使用Cassandra 2.0.7中发布的新CqlRecordReader
。
编辑:请注意,CqlPagingRecordReader
会抛出异常,这意味着您仍在使用旧的记录阅读器。