【问题标题】:select randow row from cassandra从 cassandra 中选择随机行
【发布时间】:2015-07-26 23:17:22
【问题描述】:

我有下表:

CREATE TABLE prosfiles (
  name_file text,
  beginpros timestamp,
  humandate timestamp,
  lastpros timestamp,
  originalname text,
  pros int,
  uploaded int,
  uploader text,
  PRIMARY KEY (name_file)
)
CREATE INDEX prosfiles_pros_idx ON prosfiles (pros);

在这个表中,我保留了几个由 py​​thon 脚本处理的 csv 文件的位置,因为我有几个脚本同时运行处理这些文件,我使用这个表来保持控制并避免两个脚本开始处理同一个文件('pros' 列中的 0 表示文件尚未处理,1 表示已处理的文件,1010 表示当前正在由另一个脚本处理的文件)

每个文件都运行以下查询来选择要处理的文件:

"select name_file from prosfiles where pros = 0 limit 1"

但这总是返回具有该条件的文件的第一行

我想运行一个查询,从所有 pros = 0 的行中返回一个随机行。

在 mysql 中我使用了“order by rand()”,但在 cassandra 中我不知道如何对结果进行随机排序。

【问题讨论】:

标签: python cassandra cassandra-2.0


【解决方案1】:

看起来您使用 Cassandra 作为队列和 it's not the best usage pattern for it,使用 rabbitmq/sqs/any-other-queue-service。此外,Cassandra 根本不支持排序,它的想法是:

  • 如果您尝试对 1B 行进行排序,排序将需要在数据库中进行大量计算。
  • 在分布式环境中排序不是一件容易的事:您必须要求所有持有数据的节点来执行它。

但如果您知道自己在做什么,您可以重新访问您的数据库架构以更适合这种类型的工作负载:

  • 将源表拆分为两个不同的表:第一个包含完整的文件信息,第二个包含队列本身,其中仅包含要处理的文件 ID。
  • 您的工作进程从queue 表中读取随机行(见下文如何通过主键从 cassandra 中读取 ~random 行)
  • worker 从queue 中删除目标ID,并使用处理信息更新您的目标表。

这种做事方式会导致你可能出现的错误:

  • 多个工作人员可以同时获得相同的目标。
  • 如果您有很多工作人员和目标,Cassandra 的压缩过程会影响您的 DIY 队列的性能。

要通过主键从表中读取伪随机行,您可以使用以下查询:select * from some_table where token(id_column)>some_random_long_value limit 1,但它也有它的缺点:

  • 如果您有一小部分目标,它会偶尔返回空结果,因为您的 some_random_long_value 将高于任何现有密钥的令牌。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-03
    • 2023-04-03
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多