首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在BigQuery中回填分区数据?

如何在BigQuery中回填分区数据?
EN

Stack Overflow用户
提问于 2022-06-22 10:20:31
回答 2查看 162关注 0票数 0

我正在尝试将数据从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中填充的。我哪里出问题了?

有指引吗?

EN

回答 2

Stack Overflow用户

发布于 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,需要在查询中使用特别提到列名。

代码语言:javascript
运行
复制
SELECT *,_PARTITIONTIME AS ingestionTime 
FROM gcp_billing_export_v1 
WHERE DATE(_PARTITIONTIME) = @run_date

上面的查询将返回gcp_billing_export_v1表中的所有数据,其中包含一个额外的列ingestionTime

现在您可以回填5月15日的数据,并将其保存到新的表中。

您还可以围绕下面的查询进行调整,以实现相同的查询。

代码语言:javascript
运行
复制
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子句)。

票数 2
EN

Stack Overflow用户

发布于 2022-06-22 12:04:22

看起来你在使用摄取分区。

您需要使用所需的分区( EventDate )创建一个新表,并使用历史数据和新的日常数据填充该新表--因为您不能覆盖现有分区。

链接此处:表格

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72713708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档