【问题标题】:How to get a range of data from Cassandra如何从 Cassandra 获取一系列数据
【发布时间】:2015-01-15 03:08:40
【问题描述】:

[cqlsh 5.0.1 |卡桑德拉 2.1.0 | CQL 规范 3.2.0 |原生协议 v3]

table:
CREATE TABLE dc.event (
    id timeuuid PRIMARY KEY, 
    name text

) WITH bloom_filter_fp_chance = 0.01;

如何从 Cassandra 获取时间范围的数据?

例如,当我尝试'select * from event where id> maxTimeuuid('2014-11-01 00:05+0000') and minTimeuuid('2014-11-02 10:00+0000')' 时,如此处所示http://www.datastax.com/documentation/cql/3.0/cql/cql_reference/timeuuid_functions_r.html

我收到以下错误:'code=2200 [Invalid query] message="Only EQ and IN relation are supported on the partition key (unless you use the token() function)"'

我可以保留timeuuid作为主键并满足要求吗?

谢谢

【问题讨论】:

    标签: cassandra cqlsh


    【解决方案1】:

    我可以保留timeuuid作为主键并满足要求吗?

    不是真的,不。来自http://www.datastax.com/documentation/cql/3.1/cql/cql_reference/select_r.html

    WHERE 子句可以包含大于和小于比较, 但是对于给定的分区键,集群列上的条件 仅限于允许 Cassandra 选择 行的连续排序。

    您可以尝试在查询中添加“ALLOW FILTERING”...但我怀疑这会奏效。而且我不知道标记timeuuids的好方法(我也不相信有好方法)。我有大约 99% 的把握,来自分区器的排序会产生意想不到的糟糕结果,即使查询本身会执行并且在您深入挖掘之前看起来是正确的。

    顺便说一句,你真的应该看看大约一年前提出的类似问题:time series data, selecting range with maxTimeuuid/minTimeuuid in cassandra

    【讨论】:

      【解决方案2】:

      短答案,否。长答案,你可以做类似的事情:

      创建表 dc.event ( event_time 时间戳, id timeuuid, 名称文本, 主键(event_time,id) ) WITH Bloom_filter_fp_chance = 0.01;

      时间戳可能会被截断,使其仅反映一整天(或一小时或一分钟,具体取决于您的数据速度)。您的 where 子句必须包含 timeuuid 范围中包含的时间戳的“IN”参数。

      如果您使用适当的分块因子(您将时间戳截断多少),您甚至可以在不使用 timeuuid 范围的情况下回答您正在寻找的一些问题,只需一个简单的 where 子句。

      从本质上讲,这允许您在尊重 Cassandra 限制的同时进行所需的查询。正如 Raedwald 指出的那样,您不能在连续范围内使用分区键,因为 Cassandra 的基础性质是大散列——也就是说,众所周知,Cassandra 在时间序列数据中做了一些非常强大的事情。

      【讨论】:

        【解决方案3】:

        看看 Newts 如何为范围做时间序列。作者有一组很棒的幻灯片和一个描述数据模型的演讲,可以准确地得到你想要的东西。 https://github.com/OpenNMS/newts/

        【讨论】:

          【解决方案4】:

          Cassandra 不能进行这种查询,因为 Cassandra 是使用巨型哈希映射实现的键值对存储,而不是关系数据库。就像内存中的哈希映射一样,在子范围内查找键值的唯一方法是遍历所有键。对于内存中的哈希映射来说,这可能足够昂贵,但对于 Cassandra 来说,这将是严重的。

          【讨论】:

            【解决方案5】:

            是的,您可以将sparkscalaspark-cassandra-connector 一起使用!

            我认为 you should 可以通过将 partition keys 设置为“YYYY-MM-dd hh:00+0000”并仅过滤日期和时间来减少您的 partition keys

            然后你可以使用类似的东西:

            case class TableKey(id: timeuuid) 
            val dates = Array("2014-11-02 10:00+0000","2014-11-02 11:00+0000","2014-11-02 12:00+0000")    
            val selected_data = sc.parallelize(dates).map(x => TableKey(_)).joinWithCassandraTable('dc', 'event')
            

            您已经选择了可以收集的数据rdd

            val data = selected_data.collect
            

            我有similar problem...

            【讨论】:

              猜你喜欢
              • 2020-11-25
              • 1970-01-01
              • 1970-01-01
              • 2017-02-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-02-05
              相关资源
              最近更新 更多