【问题标题】:cassandra 2.0.11 - column count for partition keycassandra 2.0.11 - 分区键的列数
【发布时间】: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)

谢谢

【问题讨论】:

    标签: cassandra cassandra-2.0


    【解决方案1】:

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

    【讨论】:

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

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

    【讨论】:

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