Cassandra中的复合列和“IN”关系

时间:2013-09-24 19:29:51

标签: cassandra

我在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

1 个答案:

答案 0 :(得分:1)

Thrift API中没有“IN”型查询。您可以针对每个复合列值(getday_of_yearminute_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测试。)