根据 BEAM 的 programming guide ,并且根据许多threads join
可以通过 CoGropByKey
或 KeyedPCollectionTuple
( coockbook ) 来实现。
没有人谈论此类转换的性能。
我的流程应该非常简单:从 BQ 表 (TableRow
) 批量输入行,并通过相同的键将它们与其他 BQ 表中的其他值连接(或“丰富”)。因此最终输出也应该是 TableRow
类型。
我想了解将 BEAM 中的 2 个表与 BQ 表连接的最佳实践是什么。
例如,我可以在 BQ 中创建一个 View 并替换所有这些管道并执行更有效的连接操作,但我想处理代码中的所有逻辑
处理join
操作时幕后发生了什么?
DirectRunner
是否会对第二个 BQ 表执行 n 次查询,以便连接所有管道批处理(逐项)?或者 BEAM 足够智能,可以聚合它并执行所有批处理的 1 个查询?
Google DataflowRunner
的工作方式是否不同?
除了检查运行时间之外,如何检查该管道的性能?
最佳答案
TTBOMK,您不想在代码中编写完整的 SQL,例如 WHERE 子句。 Beam 或实际上任何基于代码的 SQL 连接对于 BQ 中保存的大量数据都会失败。 因此,任何此类“丰富”实际上都应该由底层数据处理解决方案来完成,无论是 BQ 之上的 SQL 还是 RDD/DataFrames/等之上的 Spark。
请注意,它不太适合流式处理,更适合批处理流。 如果您想遵循纯流式处理方式,则应该根据您的域使用快速数据库,并避免使用 OLAP 样式(真正的柱状)数据库。 BQ 每个查询都有很大的延迟。
告诉我们进展如何:)
关于java - 如何使用 Apache BEAM 在 BigQuery 中执行快速联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56665086/