cassandra中的复合密钥,其中pig和where子句表示where子句中的部分密钥

hpcdzsge  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(472)

我基本上有相同的问题,在Cassandra与Pig下面的复合键。唯一的区别是我尝试在pig的where\u子句中查询复合键的一部分。
数据结构类似于前面提到的问题,我将复制一些代码/上下文以最小化对该问题的读取。
我们有一个cql表,它看起来像这样:

CREATE table data (
    occurday  text,
    seqnumber int,
    occurtimems bigint,
    unique bigint,
    fields map<text, text>,
    primary key ((occurday, seqnumber), occurtimems, unique)
)

我没有同时查询seqnumber和occurday(就像前面提到的问题一样),而是尝试查询其中一个键。
但是,如果我在pig中作为加载的一部分执行这个查询,事情就不起作用了。

-- 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中了解到的,当显式声明分区键时,我应该能够使用分区键的一部分进行查询?
另外,在阅读add cqlrecordreader以利用本机cql分页时,我得到的印象是这应该是可能的,但是我(在我看来)没有明确的方向来完成这一点。
在这一点上,任何帮助都是非常受欢迎的。
当做,
伦纳特·韦杰
附言。
我正在运行Cassandra2.0.9与Pig0.13.0

flvtvl50

flvtvl501#

根据cassandra-6311,我认为您需要应用6331-v2-2.0-branch.txt补丁,重新编译pig,然后将load语句更新为:

data = LOAD 'cql://ks/data?where_clause=occurday%3D%272013-10-01%27' USING CqlInputFormat();

关键的变化是 USING CqlInputFormat() 触发了新的 CqlRecordReader 这是在Cassandra2.0.7中发布的。
编辑:注意异常是从 CqlPagingRecordReader 也就是说你还在用旧的唱片阅读器。

相关问题