cassandra - Clave compuesta en Casandra con Cerdo
apache-pig (1)
Tenemos una tabla CQL que se ve así:
CREATE table data (
occurday text,
seqnumber int,
occurtimems bigint,
unique bigint,
fields map<text, text>,
primary key ((occurday, seqnumber), occurtimems, unique)
)
Puedo consultar esta tabla desde cqlsh
esta manera:
select * from data where seqnumber = 10 AND occurday = ''2013-10-01'';
Esta consulta funciona y devuelve los datos esperados.
Sin embargo, si ejecuto esta consulta como parte de una LOAD
dentro de Pig, las cosas no funcionan.
-- Need to URL encode the query
data = LOAD ''cql://ks/data?where_clause=seqnumber%3D10%20AND%20occurday%3D%272013-10-01%27'' USING CqlStorage();
da
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)
¿No deberían estos comportarse igual? ¿Por qué la versión a través de Pig falla donde funciona el comando straight cqlsh
?
Hadoop está usando CqlPagingRecordReader para intentar cargar sus datos. Esto lleva a consultas que no son idénticas a las que ha ingresado. El lector de registros de búsqueda está tratando de obtener pequeñas porciones de datos de Cassandra a la vez para evitar tiempos de espera.
Esto significa que su consulta se ejecuta como
SELECT * FROM "data" WHERE token("occurday","seqnumber") > ? AND
token("occurday","seqnumber") <= ? AND occurday=''A Great Day''
AND seqnumber=1 LIMIT 1000 ALLOW FILTERING
Y esta es la razón por la que está viendo su error clave repetido. Enviaré un error al Proyecto Cassandra.