【问题标题】:Why Cassandra query not fetching data为什么 Cassandra 查询不获取数据
【发布时间】:2015-09-24 19:05:18
【问题描述】:

我一直在为列族建模。截至目前,主键是 主键((side,rundate),fund)。所以我正在执行以下查询

 select count(*) from cf_Summary 
 where side = 'Long'and rundate in ('2015-01-12 05:30:00','2015-01-13 05:30:00');

上面的查询返回 1200。如果我在下面运行查询,那么它返回 0 条记录。

select count(*) from cf_Summary 
where token(side,rundate)>= token('Long','2015-01-12 05:30:00') and token(side,rundate) <= token('Long','2015-01-13 05:30:00');

令牌运算符可以应用于 datastax 网站中提到的最后两个分区列。 http://www.datastax.com/dev/blog/a-deep-look-to-the-cql-where-clause

为什么我在第二个查询中得到 0 计数。 Side 有两个值 Long 和 Short 所以我想在某个时间执行查询 long 和 sometime for short 以及某个日期范围内的两个值。在第一个查询中,我可以限制运行日期,但可以同时查询 long 和 shot。我知道两个行键都存储在不同的行上。

是否可以执行

select count(*) from cf_valuationsummary_1 
where token(side,rundate)>= token('Long','2015-01-02 05:30:00') and token(side,rundate) <= token('Short','2015-01-03 05:30:00');

协调器节点可以查询两个节点以获取数据,但我想从客户端应用程序执行单个查询,尽管存在性能问题

有什么线索吗??

【问题讨论】:

    标签: cassandra nosql


    【解决方案1】:

    看起来您在两个查询中使用了不同的日期字符串。

    在第一个带有 IN 子句的查询中,您使用了日期 01-12 和 01-13。

    但在令牌查询中,您使用的日期为 01-02 和 01-03。

    所以也许你没有 01-02 和 01-03 的任何行。

    除此之外,令牌查询看起来是有效的。


    更新:

    我又做了一些实验。我认为这种类型的查询可能只适用于 ByteOrderedPartitioner。使用 Murmur3Partitioner 时,给定分区键的令牌值不按日期字符串排序。例如,使用以下数据:

    cqlsh:test> select * from cf_Summary;

     side  | rundate             | fund
    -------+---------------------+------
     Short | 2015-01-13 05:30:00 |  HIJ
      Long | 2015-01-12 05:30:00 |  ABC
      Long | 2015-01-13 05:30:00 |  DEF
     Short | 2015-01-12 05:30:00 |  HIJ
    

    我们得到这样的令牌值:

    cqlsh:test> select token(side,rundate) from cf_Summary;

     token(side, rundate)
    ----------------------
     -2522183250639624078
     -2064350486281951596
     1812183325578390943
     7832903641319907586
    

    因此您可以看到日期较高的 Short 行具有负标记值,而较早的 Short 日期具有正标记值。因此,如果我对这些标记值进行范围查询,它会找到零行。对于 Long 行,较早日期的令牌值为负数,而较晚日期为正数,因此找到了两个 Long 行。

    cqlsh:test> select count(*) from cf_Summary where token(side,rundate)>= token('Short','2015-01-12 05:30:00') and token(side,rundate)

    计数

     0
    

    cqlsh:test> select count(*) from cf_Summary where token(side,rundate)>= token('Long','2015-01-12 05:30:00') and token(side,rundate)

    计数

     2
    

    因此,总的来说,我认为您尝试做的事情不会奏效,因为令牌值与您增加的日期没有直接关系。

    【讨论】:

    • 我已经编辑了这个问题。令牌查询不返回数据,而 IN 查询返回数据
    • 第一个和第二个查询在我的设置中都可以正常工作。您能否显示您的表定义、您使用的分区器以及您使用的 Cassandra 版本。
    • 明白你的意思。有没有其他方法可以查询数据。我有时间序列数据。每天数百万笔交易。最常见的查询在 where 子句中有 rundate。可以在日期范围内查询交易,因此 rundate 必须是分区键的最后一列。 Side 是第一个分区键,以便将一个日期数据分成两个分区。要求是长边、短边或两者都查询。
    • 嗯,这是一个不同的问题,所以您可能想为此提出一个新问题。 C* 只擅长分区内的范围查询,因此您需要设置表以将正确的数据放在单个分区中。您可能需要具有不同数据视图的多个表来支持您的所有查询。如果您想跨多个分区进行查询/分析,那么您可能需要考虑将 C* 与 spark 配对。
    • Cassandra 2.2 允许 IN 运算符与主键中的任何列一起使用,可以使用上述查询。等待 C* 2.2 用于生产用途
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2013-12-10
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多