在 BigQuery 中处理大偏移量

Dav*_*542 2 bigdata google-bigquery google-cloud-platform

我试图通过使用偏移量获取特定行号来模拟 BigQuery 中的分页。看起来检索结果的时间随着偏移量的增加而逐渐减少,直到出现ResourcesExceeded错误。以下是一些查询示例:

在此输入图像描述

是否有更好的方法可以在 BigQuery 中使用相当于“偏移”的功能,而不会导致性能下降?我知道这可能需要一个不存在的灵丹妙药,但我想知道是否有解决方法可以实现上述目标。如果没有,如果有人可以建议一种替代方法来获得上述内容(例如kinetica或cassandra或任何其他方法),我们将不胜感激。

Dan*_*ath 6

BigQuery 等系统中的偏移量通过读取并丢弃所有结果直到偏移量来工作。

您需要使用列作为下限,以使引擎能够直接从键范围的该部分启动,您不能让引擎在查询中有效地随机查找。

例如,假设您想按费率代码、上车和下车时间查看出租车行程:

SELECT *
FROM [nyc-tlc:green.trips_2014]
ORDER BY rate_code ASC, pickup_datetime ASC, dropoff_datetime ASC
LIMIT 100
Run Code Online (Sandbox Code Playgroud)

如果您通过 OFFSET 100000 执行此操作,则需要 4 秒,第一行是:

pickup_datetime: 2014-01-06 04:11:34.000 UTC
dropoff_datetime: 2014-01-06 04:15:54.000 UTC
rate_code: 1
Run Code Online (Sandbox Code Playgroud)

如果我使用这些日期和速率值而不是偏移量,则查询只需要 2.9 秒:

SELECT *
FROM [nyc-tlc:green.trips_2014]
WHERE rate_code >= 1
  AND pickup_datetime >= "2014-01-06 04:11:34.000 UTC"
  AND dropoff_datetime >= "2014-01-06 04:15:54.000 UTC"
ORDER BY rate_code ASC, pickup_datetime ASC, dropoff_datetime ASC
limit 100
Run Code Online (Sandbox Code Playgroud)

那么这是什么意思?与其允许用户指定特定的结果#范围(例如,从 100000 开始的新行),不如以更自然的形式指定它(例如,2015 年 1 月 6 日开始的行程如何。

如果您想要变得更奇特并且确实需要允许用户特定的实际行号,您可以通过提前计算行范围来提高效率,例如查询所有内容一次并记住一小时开始时的行号每天(8760 个值),甚至分钟(525600 个值)。然后您可以使用它来更好地猜测有效的启动。查找给定行范围(例如在云数据存储中)的最接近的日期/分钟,然后将该用户查询转换为上面更高效的版本。