从cassandra中选择randow行

时间:2015-05-15 06:03:56

标签: python cassandra cassandra-2.0

我有下表:

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文件的位置,因为我有几个脚本同时运行处理这些文件,我使用这个表来保持控制并避免两个脚本开始处理同一个文件(在'pros'列中0表示文件未处理,1表示已处理文件,1010表示当前正由另一个脚本处理的文件)

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

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

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

我想运行一个查询,返回所有pros = 0的randow行。

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

1 个答案:

答案 0 :(得分:1)

看起来你正在使用Cassandra作为队列和it's not the best usage pattern for it,使用rabbitmq / sqs / any-other-queue-service。 Cassandra也根本不支持排序,而且完成了以下想法:

    如果您尝试对1B行进行排序,
  • sort将需要在数据库内进行大量计算。
  • sort在分布式环境中不是一项简单的任务:您必须要求所有持有数据的节点执行它。

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

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

这种做事方式会引发可能的错误:

  • 多个工人可以同时获得相同的目标。
  • 如果你有很多工人和目标,Cassandra的压缩过程将会破坏你的DIY队列的性能。

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

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