cassandra 2.0.11 - 分区键的列数

Posted

技术标签:

【中文标题】cassandra 2.0.11 - 分区键的列数【英文标题】:cassandra 2.0.11 - column count for partition key 【发布时间】:2015-01-28 10:44:43 【问题描述】:

让我们考虑从http://planetcassandra.org/blog/getting-started-with-time-series-data-modeling/ 获取的下表

CREATE TABLE temperature 
(
    weatherstation_id text,
    event_time timestamp,
    temperature text,
    PRIMARY KEY (weatherstation_id,event_time)
);

所以weatherstation_id 是分区键,event_time 是集群列。 数据被加载到该表中,然后我们运行查询:

SELECT COUNT(1) FROM temperature WHERE weatherstation_id = '1234ABCD'

所以实际上我们要求的是底层 cassandra 存储行中的列数。

1) 它是 O(1) 操作吗? 2)如果不是 - 如何在计算 cassandra 存储行中的列时实现 O(1)?使用计数器?

(我使用的是 Cassandra v2.0.11)

谢谢

【问题讨论】:

【参考方案1】:

这不是 O(1) 操作,因为它必须扫描分区并计算列数。如果您想要一个恒定的时间计数,则必须以其他方式对其进行跟踪。您可以使用计数器列,但您应该先阅读this。

【讨论】:

我很惊讶分区内的列数没有存储在分区元数据或类似的东西中 @fuggy_yama 存储列数没有帮助。分区的数据可能会分布在多个 SSTable 和 Memtable 中,并且需要合并计数。不幸的是,您不能将这些计数加在一起,因为相同的列可能存在于多个位置。【参考方案2】:

对于这样的问题,我可能会使用汇总方法。您将事件存储在一个表中,然后定期运行一个任务来聚合您需要的有关数据的任何统计信息,然后将其插入另一个表中。第二个表就像一个缓存,例如,如果您正在运行一个网络服务器,它可以立即提供这些统计信息。如果您使用分区键直接将您带到具有所需统计信息的行,则访问时间为 O(1)。缺点是汇总表在任何给定时刻都没有准确的计数,但对于分布式计算,接近正确答案通常就足够了。

【讨论】:

听起来不错(在我的情况下,不需要 100% 精确计数),但它需要运行计划的 hadoop 作业来计算统计信息 - hadoop 作业是否昂贵? 如果正在处理的表很大,Hadoop 作业可能会很昂贵。如果您正在进行汇总,您会希望避免在每次更新时重新扫描相同的数据。除了 Hadoop,还有其他方法,例如 spark。 具体来说,您应该查看 Spark Streaming,它可以让您在指定的时间窗口内保持更新计数。

以上是关于cassandra 2.0.11 - 分区键的列数的主要内容,如果未能解决你的问题,请参考以下文章

休眠:外键的列数错误

UNION与IN在Cassandra中分区键的性能

Cassandra中的行键

为数据集创建了外部 Bigquery 配置单元分区表,但无法查看具有分区键的列

Cassandra分页和令牌功能;选择分区键

无法使用 datastax java 驱动程序通过 UDT 键从 cassandra 检索