【问题标题】:Joining data in apache beam / cloud dataflow在 apache 梁/云数据流中加入数据
【发布时间】:2021-12-10 01:09:40
【问题描述】:

我有两个需要合并的来源。假设这些源中的每一个都有大约 100M 行数据,并且我想将针对这些源运行的两个查询的结果连接起来。因此,从概念上讲,连接查询如下所示:

SELECT *
FROM
    (query1 against ElasticSearch source -- results are of unknown size)
    JOIN
    (query2 against BigQuery source -- results are of unknown size)
    ON query1.joinkey = query2.joinkey

换句话说,query1 的结果可以是 0 字节/行到 10GB/100M 行之间的任何地方。与query2的结果相同。

Apache Beam 或 Cloud Dataflow 如何处理“未知大小”的联接?例如,在我定义两个运行时查询的情况下。此外,对于上述情况,Apache Beam 是一个很好的资源还是有更好的选择?

我想在这两种尺寸可能是无限尺寸的情况下,最好将连接(至少在概念上)作为:

WITH query1 AS (
    es_query -> materialize to BigQuery
)
SELECT *
FROM
     query1 JOIN query2 USING (joinkey)

【问题讨论】:

    标签: join google-cloud-platform google-cloud-dataflow apache-beam


    【解决方案1】:

    您可以通过多种方式处理 Apache Beam 管道中的连接。例如,

    这两种方法都没有设定大小限制,因此应该适用于任意大型数据集。但是边输入更适合在处理大型数据集作为主要输入时馈送(和迭代)相对较小的数据集的情况。因此,如果两个数据集都很大并且大小相对相同,则 CoGroupByKey 可能更适合您的情况。

    有关 Java 和 Python 的其他代码示例,请参阅 herehere

    【讨论】:

    • 酷。您想展示一个包含两个虚构来源的示例以及如何完成吗?
    • 添加了示例管道的链接。
    • 出于好奇,既然您是 GCP 团队的一员,那么加入两个来源并查询该结果而不是同时保存 BQ(或 bigquery-on-gcs-parquet)有什么优势并查询该结果?什么时候会比另一个更好?
    • (我的意思是在 Apache Beam 中加入结果与将所有内容推送到 BQ 并在那里执行)
    猜你喜欢
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2021-08-14
    相关资源
    最近更新 更多