gpt4 book ai didi

python - 从 cassandra 中选择随机行

转载 作者:太空宇宙 更新时间:2023-11-03 17:42:50 25 4
gpt4 key购买 nike

我有下表:

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);

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

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

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

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

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

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

最佳答案

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

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

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

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

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

  • 多个工作人员可以同时实现同一目标。
  • 如果您有大量工作人员和目标,Cassandra 的压缩过程会降低您的 DIY 队列的性能。

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

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

关于python - 从 cassandra 中选择随机行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30252595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com