Clé composite à Cassandra avec cochon



apache-pig (1)

Nous avons une table CQL qui ressemble à ceci:

CREATE table data (
  occurday  text,
  seqnumber int,
  occurtimems bigint,
  unique bigint,

  fields map<text, text>,

  primary key ((occurday, seqnumber), occurtimems, unique)
)

Je peux interroger cette table à partir de cqlsh comme ceci:

select * from data where seqnumber = 10 AND occurday = '2013-10-01';

Cette requête fonctionne et renvoie les données attendues.

Si j'exécute cette requête dans le cadre d'une LOAD partir de Pig, cependant, les choses ne fonctionnent pas.

-- Need to URL encode the query
data = LOAD 'cql://ks/data?where_clause=seqnumber%3D10%20AND%20occurday%3D%272013-10-01%27' USING CqlStorage();    

donne

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)

Ne devraient-ils pas se comporter de la même manière? Pourquoi la version via Pig échoue-t-elle là où la commande cqlsh fonctionne?


Hadoop utilise CqlPagingRecordReader pour essayer de charger vos données. Cela conduit à des requêtes qui ne sont pas identiques à celles que vous avez saisies. Le lecteur d'enregistrement de radiomessagerie essaie d'obtenir de petites tranches de données Cassandra à la fois pour éviter les délais d'attente.

Cela signifie que votre requête est exécutée en tant que

SELECT * FROM "data" WHERE token("occurday","seqnumber") > ? AND
token("occurday","seqnumber") <= ? AND occurday='A Great Day' 
AND seqnumber=1 LIMIT 1000 ALLOW FILTERING

Et c'est pourquoi vous voyez votre erreur de touche répétée. Je vais soumettre un bug au projet Cassandra.

Jira: https://issues.apache.org/jira/browse/CASSANDRA-6151