cassandra中的复合密钥

rhfm7lfc  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(357)

我们有一个cql表,它看起来像这样:

  1. CREATE table data (
  2. occurday text,
  3. seqnumber int,
  4. occurtimems bigint,
  5. unique bigint,
  6. fields map<text, text>,
  7. primary key ((occurday, seqnumber), occurtimems, unique)
  8. )

我可以从中查询这个表 cqlsh 这样地:

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

此查询工作并返回预期的数据。
如果我将此查询作为 LOAD 然而,从Pig的内部来看,事情并不顺利。

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

给予

  1. InvalidRequestException(why:seqnumber cannot be restricted by more than one relation if it includes an Equal)
  2. at org.apache.cassandra.thrift.Cassandra$prepare_cql3_query_result.read(Cassandra.java:39567)
  3. at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
  4. at org.apache.cassandra.thrift.Cassandra$Client.recv_prepare_cql3_query(Cassandra.java:1625)
  5. at org.apache.cassandra.thrift.Cassandra$Client.prepare_cql3_query(Cassandra.java:1611)
  6. at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.prepareQuery(CqlPagingRecordReader.java:591)
  7. at org.apache.cassandra.hadoop.cql3.CqlPagingRecordReader$RowIterator.executeQuery(CqlPagingRecordReader.java:621)

这些行为不应该是一样的吗?为什么通过Pig的版本失败了呢 cqlsh 命令行吗?

qxsslcnc

qxsslcnc1#

hadoop正在使用cqlpagingrecordreader来尝试加载您的数据。这将导致查询与您输入的内容不同。分页记录读取器试图一次获取一小块cassandra数据,以避免超时。
这意味着您的查询将作为

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

这就是为什么您会看到重复的键错误。我将提交一个bug到cassandra项目。
吉拉:https://issues.apache.org/jira/browse/cassandra-6151

相关问题