我正在尝试将数据从GCP账单导出表回填到另一个表,比如T1。
两个表都是分区的。
下面的预定查询每天运行,以获取昨天的数据。
SELECT * FROM gcp_billing_export_v1 WHERE DATE(_PARTITIONTIME) = DATE_ADD(CURRENT_DATE(), INTERVAL -1 DAY)
现在我需要回填数据,比如说5月15日的数据--我该怎么做?
我在下面的查询中尝试了回填功能--期望回填实用程序将过去的日期(即5月15日)作为@run_date的param,但这并没有帮助。
SELECT * FROM gcp_billing_export_v1 WHERE DATE(_PARTITIONTIME) = @run_date
从源表(Gcp_billing_export_v1)中提取5月15日的数据,但根据目标表中的当前日期填充数据,即5月15日的数据是在6月22日之前在目标表T1中填充的。我哪里出问题了?
有指引吗?
发布于 2022-06-23 12:22:43
正如@Lemon已经指出的那样,您正在使用Ingestion time partitioned
表(源表和dest表),您需要了解它是如何工作的。摄取时间分区表与正则分区表不同。
从文档-
创建按摄取时间划分的表时,BigQuery将根据BigQuery获取数据的时间自动将行分配给分区。 这种类型的表有一个名为
pseudo-column
的_PARTITIONTIME
.The值,该列是每一行的摄取时间。
由于您使用的是SELECT * FROM gcp_billing_export_v1
,所以您将获得所有数据,但没有任何_PARTITIONTIME
列。当您将相同的结果保存到目标表中时,它将按照destintaion表的Dataingestion-time
更新_PARTITIONTIME
列。
因此,在_PARTITIONTIME
中有具有当前日期的旧数据。
为了避免这种情况,目标表需要是普通表或常规分区表。
另外,您需要有一个额外的列来保存来自源的Datetime
值,_PARTITIONTIME
column.You可以在这个新列上创建一个常规分区。
然后,要在结果集中获取_PARTITIONTIME
,需要在查询中使用特别提到列名。。
SELECT *,_PARTITIONTIME AS ingestionTime
FROM gcp_billing_export_v1
WHERE DATE(_PARTITIONTIME) = @run_date
上面的查询将返回gcp_billing_export_v1
表中的所有数据,其中包含一个额外的列ingestionTime
。
现在您可以回填5月15日的数据,并将其保存到新的表中。
您还可以围绕下面的查询进行调整,以实现相同的查询。
SELECT *,_PARTITIONTIME AS ingestionTime
FROM gcp_billing_export_v1
WHERE DATE(_PARTITIONTIME) = DATE_ADD(@run_date, INTERVAL -1 DAY)
它将按照您的需要.Now每天运行,如果您想要在5月15日的数据,那么您必须安排回填16,5月(根据where子句)。
发布于 2022-06-22 12:04:22
https://stackoverflow.com/questions/72713708
复制相似问题