Apache Beam、BigQueryIO、writeTableRows() 与 write()

Posted

技术标签:

【中文标题】Apache Beam、BigQueryIO、writeTableRows() 与 write()【英文标题】:Apache Beam, BigQueryIO, writeTableRows() vs write() 【发布时间】:2021-09-02 22:25:30 【问题描述】:

在使用 BigQueryIO 时如何选择这 2 个写入函数。

找到了 official doc 这里不推荐提到writeTableRows(),但不明白为什么。

    我可以使用gson 将我的Java POJO 序列化为TableRow 并直接使用writeTableRows() 编写 如果我使用write(),我需要手动设置TableRow对象

问题:

    为什么更喜欢write()和 这两个选项的性能差异大吗?

谢谢

【问题讨论】:

【参考方案1】:

TL;DR

这两个选项是等价的,并且具有相同的底层实现。建议不要太担心。

我的建议:

尝试使用格式化函数格式化write 中的数据。 如果你做不到,那就不要太担心,使用writeTableRows

详解

不同之处在于write 运行一个格式化函数,而对于writeTableRows,格式化函数只是一个身份。

我相信writewriteTableRows 更值得推荐,因为TableRow 对象是用JSON 序列化的。 JSON 是一种非常低效的序列化格式。

write 在将数据发送到 BigQuery 之前实现到 TableRow 的转换,writeTableRows 转换数据,然后在写入 BigQuery 之前进行几次转换 - 这意味着序列化成本可能是writeTableRows 更高。

这有意义吗?谢谢!

太多细节的解释

this pull request 中添加了 Javadoc 中的“推荐”字样。我问过为什么 - 我们应该希望得到答复:)

【讨论】:

他们回答说“writeTableRows 通常更昂贵,因为它依赖于 json 对象。”正如您在回答中建议的那样。 有道理。如果你的行很宽(很多列),那么 JSON 的低效率会更糟 - 但如果你的行不是很大,那么它可能大部分都很好 - 不过,最好使用 format 函数 如果答案合适,您可以选择它作为回答您的问题:)

以上是关于Apache Beam、BigQueryIO、writeTableRows() 与 write()的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Apache Beam BigQueryIO 每次运行都使用相同的 JobId?

Apache Beam 的 BigQueryIO (Java):无法将 TIMESTAMP 字段写入 BigQuery——fastxml.jackson 异常“类型不支持”

Apache-beam Bigquery .fromQuery ClassCastException

Bigtable IO 连接器是不是有 Apache Beam DynamicDestinations?

Beam direct-runner 慢速 BigQuery 读取

Apache Beam - org.apache.beam.sdk.util.UserCodeException:java.sql.SQLException:无法创建 PoolableConnecti