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

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

根据 BEAM 的 programming guide ,并且根据许多threads join 可以通过 CoGropByKeyKeyedPCollectionTuple ( 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/

相关文章:

google-cloud-dataflow - Google Cloud Pub/Sub 到 BigQuery 模板主题订阅

java - 安卓火力地堡 : Set Value not working

java - 如何从 Callable 返回中期结果?

java - 必须安装 Java 才能运行 Java 应用程序吗?

sql - 获取每组得分前 5 行

mysql - SQL 在不同的字节中拆分 hexastring

java - 异常后继续 while 循环

google-bigquery - 提前确定分组与分组

java - 使用 Beam/Dataflow 下拉每个元素上的 BigQuery 表架构很慢

将批处理数据与存储在 BigTable 中的数据合并