使用 write_truncate 通过 Google Dataflow/Beam 将数据加载到 Biqquery 分区表中

Posted

技术标签:

【中文标题】使用 write_truncate 通过 Google Dataflow/Beam 将数据加载到 Biqquery 分区表中【英文标题】:Loading data into Biqquery Partitioned table through Google Dataflow/Beam with write_truncate 【发布时间】:2017-02-21 08:21:32 【问题描述】:

因此,我们用于每天创建一个新表的现有设置在 "WRITE_TRUNCATE" 选项下运行良好,但是当我们更新代码以使用分区表时,虽然我们的数据流作业无法使用write_truncate。

它工作得非常好,写入配置设置为“WRITE_APPEND”(据我了解,来自beam,它可能会尝试删除表,然后重新创建它),因为我正在提供表装饰器创建新表失败。

使用 python 代码的示例 sn-p:

beam.io.Write('Write()'.format(date), beam.io.BigQuerySink(output_table_name + '$' + date, create_disposition=beam.io.BigQueryDisposition.CREATE_NEVER, write_disposition=beam.io.BigQueryDisposition.WRITE_TRUNCATE)

给出错误:

表格 ID 必须是字母数字

因为它试图重新创建表,我们在参数中提供了分区装饰器。

以下是我尝试过的一些事情:

    将 write_disposition 更新为 WRITE_APPEND,虽然有效,但没有达到目的,因为再次在同一日期运行会重复数据。 使用

bq --apilog /tmp/log.txt load --replace --source_format=NEWLINE_DELIMITED_JSON 'table.$20160101' sample_json.json

命令,根据我找到的link,查看我是否可以观察任何日志,了解截断实际上是如何工作的。

    尝试了其他一些links,但这也使用了 WRITE_APPEND。

有没有办法使用 write_truncate 方法从数据流作业写入分区表?

如果需要任何其他详细信息,请告诉我。 谢谢

【问题讨论】:

使用分区装饰器创建表失败可能是一个bug。让我检查一下并回复你。 您能否为您的“表 ID 必须是字母数字”提供堆栈跟踪? 我检查了 IO 开发人员。现在好像不支持这个了。 : / 感谢您回复 Pablo :),我只希望它不会删除 TRUNCATE 的表,而只是清除该分区的所有行,但我想它不会那样工作@ 987654325@. @Sirius 挖掘这个备份(尽管这是一个非常古老的问题),因为我在一个非常相似的场景中运行。您最终是否将 Jira 卡提交到 [this][issues.apache.org/jira/browse/… 页面或使用此处未讨论的其他方法解决? 【参考方案1】:

目前似乎不支持此功能。 感谢@Pablo 从 IO 开发人员那里找到答案。

根据 Github 页面上的Beam documentation,他们的JIRA page 将适合请求此类功能。我建议在此处提交功能请求并在此处的评论中发布链接,以便社区中的其他人可以跟进并表示支持。

【讨论】:

以上是关于使用 write_truncate 通过 Google Dataflow/Beam 将数据加载到 Biqquery 分区表中的主要内容,如果未能解决你的问题,请参考以下文章

使用 BQ API 使用 Write_Truncate 将数据加载到“分区表”

bigqueryoperator 是 write_truncate 1 个事务或 2 个事务

谷歌 BigQuery WRITE_TRUNCATE 删除所有数据

BigQueryOperator 在 write_disposition='WRITE_TRUNCATE' 时更改表架构和列模式

谷歌钱包应用内付款:未捕获的 ReferenceError:未定义 goog。 google.payments 与 goog.payments

Delphi XE4或XE5:如何以弹出格式打开Goog le Chrome?