【问题标题】:Google Cloud Dataflow table query returns more data than table hasGoogle Cloud Dataflow 表查询返回的数据多于表的数据
【发布时间】:2018-05-14 16:27:36
【问题描述】:

我的 Dataflow 管道的第一步是从存储在 bigquery 上的表中读取数据。我使用 Apache Beam Python SDK 2.3.0 并将此步骤定义为:

p | "Read Table" >> beam.io.Read(beam.io.BigQuerySource(query=query))

我的查询只是从表中读取一些列,根本没有过滤或处理值。

我的表总共包含大约 275 GB 的数据,但是我的管道报告此步骤输出接近 650 GB 的数据。为什么数据量这么大?

【问题讨论】:

    标签: python google-cloud-dataflow apache-beam


    【解决方案1】:

    读入的每个元素都包含作为字符串的列名,这会增加每行的大小。

    java there is a solution 中,直接加载到 POJO 中,不带列名。

    不幸的是,这在 python 中不可用。但是,请确保您没有传递从源检索到的 PCollection 中返回的相同元素。您可能希望将元素移动到没有字符串名称的 python 对象中,这应该会减小大小。这不会解决在管道中创建的第一个 Pcollection 的大小,但可以帮助处理下游 PCollection。

    【讨论】:

    • 谢谢。这会有所帮助,但从 BigQuery 读取是迄今为止我的管道中最慢的一步。希望 Python 尽快推出该功能。
    • 实际上我刚刚意识到,为列名设置别名可能会大大减少传输的数据量。只需要编写像SELECT col1 as a, col2 as b... 这样的查询并传递一个字典,将新名称映射到原始名称。
    • 此更改将传输的数据减少到我的 1/3 左右。然而,它对步进时间的影响很小。看起来阅读,不传输数据是这里的瓶颈。
    猜你喜欢
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多