如何在 bigquery 中创建 Delta

Posted

技术标签:

【中文标题】如何在 bigquery 中创建 Delta【英文标题】:How to create Deltas in bigquery 【发布时间】:2018-05-17 06:53:48 【问题描述】:

我在 BQ 有一张桌子,我每天都会刷新。这是每天的完整快照。 我有创建该提要的增量的业务需求。 表详细信息: 表包含 10 列 在 10 列中,有 5 列每天更改。我如何识别哪些列发生了变化并只为此创建一个快照? 例如,这里是 tableA 中的列:经常更改的列是 bold

Custid - ABC

first_product - 玩具

first_product_purchase_date - 2015-01-01

last_product - 电子书

last_product_purchase_date - 2018-05-01

second_product - 杂志

second_product_purchase_date - 2016-01-01

third_product - 空

third_product_purchase_date - 空

fourth_product - 空

fourth_product_purchase_date - 空

更多购买后数据会是这样的:

Custid - ABC

first_product - 玩具

first_product_purchase_date - 2015-01-01

last_product - 硬本

last_product_purchase_date - 2018-05-17

second_product - 杂志

second_product_purchase_date - 2016-01-01

third_product - CD

third_product_purchase_date - 2017-01-01

fourth_product - 空

fourth_product_purchase_date - 空

first_product = 购买的第一件产品 last_product = 最近购买的产品

这只是一位客户的一行记录。我拥有数以百万计的所有这些列的客户,假设每天都会更新 50 万行。

在我的增量中,我只想要任何列值发生变化的行。

【问题讨论】:

您需要样本数据和想要的结果。 @GordonLinoff 我已经用示例数据更新了问题 这里还是一片黑暗。您可能想详细说明“我每天都会刷新”。 - 你到底是怎么做的? 【参考方案1】:

您似乎对购买的每种产品及其重复都有一个列,这可能来自非规范化维度模型。要查询最后一次“更新”,您必须使用 lead 函数比较前一行的每一列。这将使用大量计算并且可能不是最佳的。

我建议使用repeated 字段。 product 和 product_purchase_date 将是重复字段,您可以简单地使用 where product_purchase_date = current_date() 进行查询,这将使用更少的计算。

去规范化维度模型旨在减少对传统数据仓库的计算。 Bigquery 是快速、高度可扩展的企业数据仓库,具有强大的计算能力。

为了更好地了解 BigQuery 在后台的工作原理,我建议您查看此document。

【讨论】:

以上是关于如何在 bigquery 中创建 Delta的主要内容,如果未能解决你的问题,请参考以下文章

如何从 java 在 BigQuery 中创建分区表?

我们可以在 BigQuery 中自定义函数吗?如何在 BigQuery 中创建日期参数?

如何在 google bigquery 中创建计算列?

如何在 bigquery 中创建标准 SQL 表

如何在 BigQuery 中创建 UDF?例程名称缺失数据集

如何通过 API 在 BigQuery 中创建没有架构的表?