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 - 分区键的列数的主要内容,如果未能解决你的问题,请参考以下文章