首页 > 解决方案 > 如何在 Google Dataflow 中组合两组不同的标识符?

问题描述

我有两组相当大的数据,每组大约 600GB。

第一个签名是:

我想收到一个带有签名的结果:KV<Long,Long>它的大小与它的大小完全相同,KV<String,String>但取自的值KV<String,Long>实际上被视为一个巨大的HashMap.

我可以想象这是许多 ETL 中非常常见的问题。有人可以提示我从哪里开始吗?

标签: javaetlgoogle-cloud-dataflowapache-beam

解决方案


给定标识符有多少个关系?

如果答案不是很多,您可以使用CoGroupByKey https://beam.apache.org/documentation/programming-guide/#core-beam-transforms

https://beam.apache.org/documentation/sdks/javadoc/2.5.0/org/apache/beam/sdk/transforms/join/CoGroupByKey.html

CoGroupByKey改变这个:

final List<KV<String, String>> emailsList =
    Arrays.asList(
        KV.of("amy", "amy@example.com"),
        KV.of("carl", "carl@example.com"),
        KV.of("julia", "julia@example.com"),
        KV.of("carl", "carl@email.com"));

final List<KV<String, String>> phonesList =
    Arrays.asList(
        KV.of("amy", "111-222-3333"),
        KV.of("james", "222-333-4444"),
        KV.of("amy", "333-444-5555"),
        KV.of("carl", "444-555-6666"));

进入这个:

final List<String> formattedResults =
    Arrays.asList(
        "amy; ['amy@example.com']; ['111-222-3333', '333-444-5555']",
        "carl; ['carl@email.com', 'carl@example.com']; ['444-555-6666']",
        "james; []; ['222-333-4444']",
        "julia; ['julia@example.com']; []");

你可以做CoGroupByKey两次,每个字符串一次一次KV<String,String>。两次都将其与KV<String,Long>.

但是,如果给定的标识符有大量的关系,默认CoGroupByKey可能不是很有效,甚至可能会耗尽内存(因为KV<String,String>数组的匹配数可能很大)。

听起来您可能需要编造自己的CoGroupByKey/版本来GroupByKey随时产生值,而不是在数组中构建它们。

如果您查看源代码,您会发现CoGroupByKey&GroupByKey只是PTransforms。

https://github.com/apache/beam/blob/master/sdks/java/core/src/main/java/org/apache/beam/sdk/transforms/join/CoGroupByKey.java


推荐阅读