Cassandra中的复合键与Pig和where_clause中where子句中的部分键

时间:2014-07-23 14:12:37

标签: cassandra apache-pig cql3

我基本上遇到与以下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

1 个答案:

答案 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会抛出异常,这意味着您仍在使用旧的记录阅读器。