Google cloud platform 按最新日期筛选BigQuery行的最有效方法

Google cloud platform 按最新日期筛选BigQuery行的最有效方法,google-cloud-platform,google-bigquery,google-cloud-dataprep,Google Cloud Platform,Google Bigquery,Google Cloud Dataprep,我目前正在开发一个ETL管道,该管道使用BigQuery存储暂存数据,然后使用Dataprep转换数据并将其存储在新的BigQuery表中以用于生产 我们一直在寻找最经济高效的方法将这些转换应用于一小部分数据时遇到一些问题,通常是从暂存数据表中的当前最长日期算起的最后X天。例如,我们需要计算暂存数据中的最大可用日期,然后检索自该日期起过去3天内的所有行。不幸的是,我们不能依赖于登台数据中的“最新日期”总是最新的。这些数据来自质量和可靠性不同的第三方API 起初,我尝试直接在Dataprep中应用

我目前正在开发一个ETL管道,该管道使用BigQuery存储暂存数据,然后使用Dataprep转换数据并将其存储在新的BigQuery表中以用于生产

我们一直在寻找最经济高效的方法将这些转换应用于一小部分数据时遇到一些问题,通常是从暂存数据表中的当前最长日期算起的最后X天。例如,我们需要计算暂存数据中的最大可用日期,然后检索自该日期起过去3天内的所有行。不幸的是,我们不能依赖于登台数据中的“最新日期”总是最新的。这些数据来自质量和可靠性不同的第三方API

起初,我尝试直接在Dataprep中应用这些转换,获取最大日期,使用DATEDIFF创建一个比较列,然后丢弃比这个“最大日期”早3天以上的行。事实证明,这非常耗时,而且在成本方面效率低下

我们尝试的下一件事是过滤BigQuery视图中的数据,然后将其用作Dataprep流的初始数据集。在Dataprep应用任何转换之前,数据将被预过滤。我们首先尝试在BigQuery中动态执行此操作,如下所示:

WITH latest_partitiontime AS (SELECT _PARTITIONTIME as pt FROM 
`{project}.{dataset}.{table}`
GROUP BY _PARTITIONTIME
ORDER BY _PARTITIONTIME DESC
LIMIT 1)

SELECT {columns}
FROM `{project}.{dataset}.{table}`
WHERE _PARTITIONTIME >= (SELECT pt FROM latest_partitiontime)
但在预览查询的GB/估计成本时,它似乎效率低下且成本高昂

我们尝试的下一件事是对日期进行硬编码,由于某些原因,这要便宜得多/快得多:

SELECT {columns}
FROM `{project}.{dataset}.{table}`
WHERE _PARTITIONTIME >= '2018-08-08'
因此,我们当前的计划是为每个表维护一个视图,并在每次登台数据成功完成时通过Python SDK更新视图SQL中的硬编码日期

感觉我们可能缺少一个更容易/更有效的解决方案来解决这个问题。所以我想问:

在Dataprep或BigQuery中按日期进行初始筛选是否更具成本效益? 过滤所选产品中数据的最经济有效的方法是什么? 您熟悉标准SQL语句和发布的版本吗?这实际上可以合并您的数据,并且您可以进一步只读取一些分区

手册中的示例:

MERGE dataset.DetailedInventory T
USING dataset.Inventory S
ON T.product = S.product
WHEN NOT MATCHED AND quantity < 20 THEN
  INSERT(product, quantity, supply_constrained, comments)
  VALUES(product, quantity, true, ARRAY<STRUCT<created DATE, comment STRING>>[(DATE('2016-01-01'), 'comment1')])
WHEN NOT MATCHED THEN
  INSERT(product, quantity, supply_constrained)
  VALUES(product, quantity, false)

提示:您可以按null进行分区,并且只利用“集群级别”

为什么使用SELECT _partitiontimeas pt FROM{project}.{dataset}.{table}GROUP by _partitiontimeorder by _partitiontimedesc LIMIT 1而不是MAX _PARTITIONTIME?GROUP BY,尤其是ORDER BY是一个非常密集的资源库……嗨,Martin。在此之前,我们也尝试了MAX_PARTITIONTIME,这对查询效率或成本没有影响,但两者都非常高。