如何使用 Apache BEAM 在 BigQuery 中执行快速联接

Posted

技术标签:

【中文标题】如何使用 Apache BEAM 在 BigQuery 中执行快速联接【英文标题】:How to perform a fast join in BigQuery with Apache BEAM 【发布时间】:2019-06-19 10:03:47 【问题描述】:

根据BEAM的programming guide,根据threadsjoin可以实现CoGropByKeyKeyedPCollectionTuple(coockbook)。

没有人谈论这类转换的性能。

我的流程应该非常简单:从 BQ 表 (TableRow) 批量输入行,并通过相同的键将它们与其他 BQ 表中的其他值连接(或“丰富”)。所以最终输出的类型也应该是TableRow

我想了解将 BEAM 中的 2 个表与 BQ 表连接的最佳做法。

例如,我可以在 BQ 中创建一个视图并替换所有这些管道并执行更有效的连接操作,但我想在代码中处理所有逻辑

在处理 join 操作时,幕后发生了什么?

DirectRunner 是否会对第二个 BQ 表执行 n 次查询以加入所有管道批次(逐项)?还是 BEAM 足够聪明,可以聚合它并对所有批次执行 1 次查询?

Google DataflowRunner 的工作方式是否不同?

除了查看运行时间,我如何查看这个管道的性能?

【问题讨论】:

【参考方案1】:

TTBOMK 您不想在代码中编写完整的 SQL,例如 WHERE 子句。 Beam 或任何基于代码的 SQL 连接都将在 BQ 中保存的大量数据上失败。 因此,任何此类“丰富”都应该由底层数据处理解决方案真正完成,无论是 BQ 之上的 SQL 还是 RDD/DataFrames/等之上的 Spark。

请注意,它不太适合流式传输,更适合批处理流。 如果您想遵循纯流式传输方式,您应该根据您的域使用快速 DB,并避免使用 OLAP 风格(真正的柱状)DB。 BQ 每次查询都有很大的延迟。

告诉我们进展如何:)

【讨论】:

以上是关于如何使用 Apache BEAM 在 BigQuery 中执行快速联接的主要内容,如果未能解决你的问题,请参考以下文章

如何运行 Apache Beam 集成测试?

Apache Beam 处理文件

如何在Apache Beam / Google Dataflow中使用ParseJsons?

如何使用 Apache Beam Python 将输出写入动态路径

如何在 Apache Beam 中写入多个文件?

使用 flink runner 时如何在 apache Beam 中执行检查点?