【问题标题】:CQL SELECT with lower bound具有下限的 CQL SELECT
【发布时间】:2014-12-05 17:52:05
【问题描述】:

假设我有一个 Cassandra DB,我需要处理大量数据,我可以使用 SELECT 查询这些数据。问题是处理速度太慢,我想使用分布式系统来完成这项工作。如何重塑 CQL 查询,以便我只能获得一部分数据?

我知道我可以使用 CQL 的 LIMIT 功能获得有限数量的行,但我需要更像 LIMIT 和 OFFSET 的东西,以便每个进程都可以获得独立的数据块。 (OFFSET 最终会在 CQL 中实现吗?我读过它效率低下,是不是它没有实现的原因?)

如Cassandra pagination: How to use get_slice to query a Cassandra 1.2 database from Python using the cql library 中所建议,我希望避免等待查询结束来开始下一个查询。这将使进程在等待之前的查询完成时保持空闲状态。


例如,假设我想处理天气数据,目前我的表看起来像(我可以使用其他数据类型进行存储,例如 timeuuid 表示时间,这只是一个虚拟问题):

CREATE TABLE weather_data (
    station varchar,
    date varchar,
    time varchar,
    value double,
    PRIMARY KEY ( (station,date), time )
);

对于给定的电台和日期,我想创建数据块(基于时间)。我可以假设我知道我对每个站点和日期有多少度量。

如果正确答案是“改变表格的结构”,我很乐意看看如何修改它。

【问题讨论】:

  • 这一切都取决于你的数据模型以及你如何查询它,你是否知道分区键之前等等。
  • @CarloBertuccini 我已经编辑了我的问题,希望对您有所帮助!

标签: cassandra-2.0 cql3


【解决方案1】:

我改变了我的答案,因为我误解了原来的问题。 我要做的是将有关电台和日期的信息分解成其他子块,例如白天时间或任何对您来说合理的划分

CREATE TABLE weather_data (
    station varchar,
    date varchar,
    dayhour int,
    time varchar,
    value double,
    PRIMARY KEY ( (station,date), dayhour, time )
);

通过这种方式,您可以将数据分成 24 个块,并允许像我之前所说的那样并行执行。例如,通过这种方式,您可以仅获得前 2 小时的时间 - 缺点是您将始终访问相同的节点。另一种方法是创建这样的主键:

PRIMARY KEY ( (station,date,dayhour), time )

这也将根据白天对您的数据进行分区,副作用是如果您需要在特定日期从给定站点获取所有测量值,则必须执行 24 次查询。 最后但并非最不重要的解决方案可能是非规范化(在新表中组织要按小时排序的数据,并保留原始数据)。

HTH, 卡罗

【讨论】:

  • 我需要知道您要执行的确切查询。我知道您需要从不同的站点/日期读取一堆数据——是吗?或者你需要一点一点地从同一站/天阅读?
  • 我需要的是,给定一个站点和一个日期,一点一点地读取数据(所以根据一天内的时间拆分数据)。实际上,我想执行与亚当在他的回答中提出的相同的查询,但没有我认为的瓶颈。
  • 感谢您花时间回答我的问题!因此,您要添加小时的信息,以便数据被“预先分块”......可能也适用于我的情况。
【解决方案2】:

您在使用时间作为聚类键的正确轨道上。

首先,我建议对“时间”聚类列使用 timeuuid,以帮助避免冲突。

除此之外,分区内的切片查询很容易使用 LIMIT 和 '>' 完成。遍历表中的样本:

SELECT time, value FROM weather_data WHERE station='station_id' and date='date_here' LIMIT 5;
SELECT time, value FROM weather_data WHERE station='station_id' and date='date_here' AND time > [last time from previous query] LIMIT 5;
...

当您停止接收数据时,您已到达此(电台、日期)分区的末尾。 (客户端驱动程序具有获取给定时间戳的最小 timeuuid 的功能,因此您通常可以概括为仅使用第二条语句)

另请参阅:链接here的简短讨论和参考

【讨论】:

  • 对不起varchar而不是timeuuid,在我的真实案例中,我确实使用了timeuuids。您的解决方案本质上是我问题中链接的解决方案,这本质上是一种串行行为(一个接一个地进行查询)。没有办法克服吗?
  • 如果主要关心的是“避免等待查询结束来开始下一个”,我会使用上面的查询结构并使用异步请求进行并行化。
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 2013-03-04
  • 2016-01-28
  • 1970-01-01
  • 2012-04-25
  • 2020-12-25
相关资源
最近更新 更多