2014-07-23 3 views
1

기본적으로 다음과 같은 문제가 발생합니다. Composite key in Cassandra with Pig. 유일한 차이점은 돼지의 where_clause 내에서 복합 키의 일부를 쿼리하려고한다는 것입니다.Cassandra와 Pig가있는 복합 키와 where 절의 키 부분에 대한 where_clause

데이터 구조는 앞에서 설명한 문제와 유사하므로 해당 문제의 읽기를 최소화하기 위해 일부 코드/컨텍스트를 복사합니다.

우리는 다음과 같이 보이는 CQL 테이블이 :

대신 (앞서 언급 한 문제의 문제였다으로) 내가 키 중 하나를 조회하려고 seqnumber과 occurday 모두 쿼리의
CREATE table data (
    occurday text, 
    seqnumber int, 
    occurtimems bigint, 
    unique bigint, 
    fields map<text, text>, 
    primary key ((occurday, seqnumber), occurtimems, unique) 
) 

.

그러나이 쿼리를 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 을 읽는 동안 나는이 가능해야한다 인상을 얻을 수 있지만, 나는 (내 생각에) 주변에이 작업을 수행하는 방법에 대한 명확한 방향을 수영하지하고 있습니다.

이 시점에서 어떤 도움도 매우 환영합니다.

감사

레나 Weijl

PS.

내가 카산드라-6311에 따르면 0.13.0

답변

0

돼지와 카산드라 2.0.9에서 실행하고, 나는 당신의 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에서 예외가 발생합니다.