BigQuery - 使用更改/删除的记录更新表

Posted

技术标签:

【中文标题】BigQuery - 使用更改/删除的记录更新表【英文标题】:BigQuery - Update Tables With Changed/Deleted Records 【发布时间】:2019-12-17 20:15:22 【问题描述】:

目前,我们将整个文件发送到云端(Google Cloud Storage)以导入 BigQuery 并进行简单的删除/替换。然而,随着文件大小的增加,我们的网络团队并不特别喜欢我们在其他 ETL 也在尝试运行时占用的带宽。因此,我们正在研究仅发送更改/删除的行。

尝试查找有关如何执行此操作的路径/帮助文档。范围——我将从一个简单的例子开始。我们有一个包含 3 亿条记录的大表。与其每晚发送 3 亿条记录,不如发送超过 X 百万条已更改/删除的记录。然后,我需要将更改/删除的记录合并到 BigQuery 表中。

我们目前使用 Node JS 通过 Composer 从 Storage 迁移到 BigQuery 和 Python,以在 BigQuery 中安排原生表更新。

希望为如何开始这条道路指明正确的方向。

【问题讨论】:

【参考方案1】:

在每次更新到 BigQuery 时将整行流式传输。 让表为同一个主要实体容纳多行。 编写一个视图,例如table_last,它选择最近的行。

通过这种方式,您可以对真实数据进行近乎实时的所有查询。 您可以偶尔通过运行仅使用最新行重写自身表的查询来对表进行重复数据删除。

另一种方法是,如果您有 1 个决赛桌和 1 个您流式传输的表,并且有一个 MERGE 语句,该语句计划每 X 分钟运行一次,以将更新从流式表写入决赛桌。

【讨论】:

感谢您的建议。我会向你提出另一个问题。该表不需要是实时的,只需每天更新一次更改/删除。你会改变你的方法吗? 这两种方法都有优点。第一个具有版本历史记录,您不需要批处理事件,因为发生行更新,您可以流式传输它。如果您想降低存储和查询成本,第二种方法非常有用。如果您说您只需要更新几次更改,那么第二个选项可能更有吸引力。

以上是关于BigQuery - 使用更改/删除的记录更新表的主要内容,如果未能解决你的问题,请参考以下文章

从 BigQuery 中删除重复记录

oracle 如何根据一个表中记录的变动更新另外一个表中相应的字段

从 Python 更新 BigQuery 表属性会使表消失

BigQuery:关于使用 nodejs 删除和更新行的问题

BigQuery:从表连接引起的子选择中删除记录

设计一种审计表更改的方法