我在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添加列系列的describe输出。由于我正在寻找基于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
答案 0 :(得分:1)
Thrift API中没有“IN”型查询。您可以针对每个复合列值(get
,day_of_year
,minute_of_day
)执行一系列event_id
次查询。
如果您的event_id
是顺序的(并且您的问题表明它们不是),您可以执行单个get_slice
查询,传入范围(例如day_of_year
,{{1 }和minute_of_day
s的范围。您可以通过这种方式抓取它们并以编程方式过滤响应(例如,使用4-3433之间的事件ID获取日期的所有数据)。更多的数据传输,更多的客户端处理,所以不是一个很好的选择,除非你真的在寻找一个范围。
因此,如果您想在Cassandra中使用“IN”,则需要切换到基于CQL的解决方案。如果您正在考虑在python中使用CQL,则另一个选项是cassandra-dbapi2。这对我有用:
event_id
(使用Cassandra 2.0.1测试。)