【问题标题】:Cassandra data order without passing where conditionCassandra数据顺序不通过where条件
【发布时间】:2017-03-31 17:11:00
【问题描述】:

我正在努力处理 Cassandra 数据的数据顺序。我有一张这样的桌子

tbl_data
 - yymmddhh (text)
 - data (text)

分离键是'yymmddhh'

我正在添加这样的数据

'16-11-17-01', 'a'
'16-11-17-01', 'b'
'16-11-17-02', 'c'
'16-11-17-03', 'xyz'
'16-11-17-03', 'e'
'16-11-17-03', 'f'

select * from tbl_data limit 10;

我希望数据按我添加数据的顺序排列。但它给出的数据是这样的

'16-11-17-03', 'f'
'16-11-17-03', 'e'
'16-11-17-01', 'a'

即最新记录优先或随机顺序。我需要与我添加的顺序相同的数据。在我的情况下,我无法弄清楚数据的默认顺序。此外,我不想在 where 条件下传递分区键,因为它会为我记住该值的开销。请给我建议解决方案。

【问题讨论】:

  • 在 Cassandra 中,您不能期望按分区键或添加数据的顺序排列数据。 Cassandra 按聚类列排序数据
  • Cassandra 不适用于您的用例。您必须按分区键过滤以对结果集强制执行任何有意义的排序顺序。完整的解释可以在这里找到:datastax.com/dev/blog/we-shall-have-order

标签: cassandra


【解决方案1】:

恐怕你会为此苦苦挣扎。

根据 cmets,您无法在分区“外部”决定顺序,除非您通过更改 partitioner 真正了解您在做什么。

请阅读suggested 链接以及thisthis SO 的答案,以了解您为何按此特定顺序获取记录(是的,它们已按顺序排列...)。

然而,一个可能的解决方案是添加一个timestamp 集群键,并将分区键更改为更简单的“yymmdd”:

tbl_data
 - yymmdd (timestamp)
 - hhmmssMMM (timestamp)
 - data (text)

现在您将每天存储数据(即您需要知道查询数据的日期),以及每个分区内数据的顺序(即每个day) 按timestamp 列排序,因此根据您的要求,您可以将记录的插入时间存储在那里。

现在,如果您不是每天都插入数据,那么您确实需要将插入日期跟踪到另一个(非常简单的)表中:

CREATE TABLE inserted_days (
    yymmdd timestamp PRIMARY KEY
);

发布一个

SELECT * FROM inserted_days

会扫描所有这个分区,以随机顺序返回记录(从你的应用程序的角度来看,所以你需要对其进行排序),但这里我们谈论的是一年的 365 条记录,你不需要担心.这很容易做到,而且您不会招致无法管理的开销。

HTH。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 2017-10-09
    • 2016-05-01
    • 1970-01-01
    • 2016-03-26
    • 2021-08-20
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多