Cassandra 和 Pig 中的复合键
Posted
技术标签:
【中文标题】Cassandra 和 Pig 中的复合键【英文标题】:Composite key in Cassandra with Pig 【发布时间】:2013-10-04 19:54:06 【问题描述】:我们有一个如下所示的 CQL 表:
CREATE table data (
occurday text,
seqnumber int,
occurtimems bigint,
unique bigint,
fields map<text, text>,
primary key ((occurday, seqnumber), occurtimems, unique)
)
我可以像这样从cqlsh
查询这张表:
select * from data where seqnumber = 10 AND occurday = '2013-10-01';
此查询有效并返回预期数据。
但是,如果我在 Pig 中将这个查询作为 LOAD
的一部分执行,那么事情就不起作用了。
-- Need to URL encode the query
data = LOAD 'cql://ks/data?where_clause=seqnumber%3D10%20AND%20occurday%3D%272013-10-01%27' USING CqlStorage();
给予
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)
这些行为不应该相同吗?为什么通过 Pig 的版本在直接 cqlsh
命令起作用的地方失败?
【问题讨论】:
【参考方案1】:Hadoop 正在使用CqlPagingRecordReader 尝试加载您的数据。这会导致查询与您输入的内容不同。分页记录读取器尝试一次获取小块 Cassandra 数据以避免超时。
这意味着你的查询被执行为
SELECT * FROM "data" WHERE token("occurday","seqnumber") > ? AND
token("occurday","seqnumber") <= ? AND occurday='A Great Day'
AND seqnumber=1 LIMIT 1000 ALLOW FILTERING
这就是为什么您会看到重复的密钥错误。我将向 Cassandra 项目提交一个错误。
吉拉: https://issues.apache.org/jira/browse/CASSANDRA-6151
【讨论】:
感谢您的更新。知道 JIRA 编号后能否将其添加到您的答案中? 我也面临同样的问题。但看起来这个问题没有解决方案(在 jira 上)。 @Chad,您是否以任何方式克服了这个问题?有什么解决方法吗? 我有一段时间没看 JIRA,所以我很惊讶地发现他们已经将它关闭为“不会修复”。他们的建议是在 Pig 中执行所有过滤,但如果您有很多分区,显然会出现效率低下的问题。 (这就是我们最终做的事情。)理论上,issues.apache.org/jira/browse/CASSANDRA-6311 应该会让事情变得更好,但看起来它只针对 Cassandra 2.x。 您是否有机会发布您如何知道 pig 创建的原始 cassandra 查询是什么?似乎 pig -d DEBUG -v 无助于弄清楚 Cassandra 从 pig 获得了什么查询。以上是关于Cassandra 和 Pig 中的复合键的主要内容,如果未能解决你的问题,请参考以下文章
时间空间序列的复合分区键 (Cassandra) 与交错索引 (Accumulo, BigTable)
Spring Data Cassandra:如何使用复合键查询表?