【发布时间】:2013-09-24 19:29:51
【问题描述】:
我在 Cassandra 中有以下列族,用于将时间序列数据存储在少数非常“宽”的行中:
CREATE TABLE data_bucket (
day_of_year int,
minute_of_day int,
event_id int,
data ascii,
PRIMARY KEY (data_of_year, minute_of_day, event_id)
)
在 CQL shell 上,我可以运行如下查询:
select * from data_bucket where day_of_year = 266 and minute_of_day = 244
and event_id in (4, 7, 11, 1990, 3433)
本质上,我修复了复合列名称 (minute_of_day) 的第一个组成部分的值,并希望根据第二个组成部分 (event_id) 的不同值选择一组不连续的列。由于“IN”关系被解释为等式关系,因此可以正常工作。
现在我的问题是,我将如何在没有 CQL 的情况下以编程方式完成相同类型的复合列切片。到目前为止,我已经尝试过 Python 客户端 pycassa 和 Java 客户端 Astyanax,但没有任何成功。
欢迎提出任何想法。
编辑:
我正在添加通过 cassandra-cli 看到的列族的描述输出。由于我正在寻找基于 Thrift 的解决方案,也许这会有所帮助。
ColumnFamily: data_bucket
Key Validation Class: org.apache.cassandra.db.marshal.Int32Type
Default column value validator: org.apache.cassandra.db.marshal.AsciiType
Cells sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.Int32Type,org.apache.cassandra.db.marshal.Int32Type)
GC grace seconds: 864000
Compaction min/max thresholds: 4/32
Read repair chance: 0.1
DC Local Read repair chance: 0.0
Populate IO Cache on flush: false
Replicate on write: true
Caching: KEYS_ONLY
Bloom Filter FP chance: default
Built indexes: []
Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
Compression Options:
sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor
【问题讨论】:
-
你确定这个查询在 cassandra cqlsh 中有效吗?在 cassandra 中,仅分区键支持 IN 操作,在您的情况下 event_id 只是集群列。
-
@abhi 它确实有效。我的理解是,复合列的最后一个组件可以指定列的范围/切片,只要前面的所有组件都指定严格的相等关系即可。看看这里:datastax.com/dev/blog/introduction-to-composite-columns-part-1
标签: cassandra