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

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

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

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

问题:

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

谢谢

【问题讨论】:

    标签: java google-bigquery gson google-cloud-dataflow apache-beam


    【解决方案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 函数
    • 如果答案合适,您可以选择它作为回答您的问题:)
    猜你喜欢
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    相关资源
    最近更新 更多