如何使用 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
可以实现CoGropByKey
或KeyedPCollectionTuple
(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 / Google Dataflow中使用ParseJsons?