如何通过时间戳分区通过 BigQuery 查询 Google stackdrive 接收的 Cloud Load Balancer 请求而不加载所有数据?

How to query Google Cloud Load Balancer requests sinked by stackdrive via BigQuery by timestamp partition without load all data?

我正在尝试按时间戳查询我的数据集,但我需要支付完整数据集扫描的费用。 是否可以仅查询特定时间戳并减少分析数据的大小?

请注意,我正在使用 Stackdrive Sink 在我的数据集上实时传输数据。我无法控制架构。

SELECT
  REGEXP_EXTRACT(httpRequest.requestUrl, r"^.+cid=([0-9]*)") as cid,
  REGEXP_EXTRACT(httpRequest.requestUrl, r"^.+pid=([0-9]*)") as pid
FROM
   `dataset_20190305` -- Date partition - no time
WHERE timestamp >=TIMESTAMP('2019-03-05 16:50:00')

只有两种方法可以仅使用 where 子句来降低 BQ 查询成本:分区和集群。从你的数据集名称来看,我怀疑你的数据集只包含与 3 月 5 日相关的数据。不幸的是,BQ 仅支持 partitioning 天,因此对您的情况没有帮助。无法按小于天的任何时间块进行分区。也就是说,如果您只是创建一个 table 并按天对其进行分区而不是每天创建一个新数据集,它可能会使您的数据更干净。

另一个选项 clustering 涉及指定字段并提供所有可能的值。例如,如果您有一个字符串类型的字段 "Color",您可以将潜在值设置为 "Red"、"Green" 和 "Blue",因此,将查询大小减少到第三.

如果您只是想降低成本并发现自己在特定 table 上多次重复类似查询,您可以查询一次并将结果复制到新的 table,这实际上会将您的查询限制在指定的时间范围内。

也就是说,一般来说,尽量遵循 BQ 的 recommendations,例如只选择您感兴趣的列。