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
,格式化函数只是一个身份。
我相信write
比writeTableRows
更值得推荐,因为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