Java 如何在Google数据流中组合两组不同的标识符?

Java 如何在Google数据流中组合两组不同的标识符?,java,etl,google-cloud-dataflow,apache-beam,Java,Etl,Google Cloud Dataflow,Apache Beam,我有两个相当大的数据集,每个都是~600GB 第一个签名是: KV其中两个字符串都表示数据库A中的标识符。它实际上代表了它们之间的一种关系 KV其中String是数据库A中的标识符,Long是数据库B中的标识符。此关系表示来自数据库A的String如何映射到数据库B中的Long 我希望收到带有签名的结果:KV,它的大小与KV完全相同,但值取自KV,它被有效地视为一个巨大的HashMap 我可以想象这是许多ETL中非常常见的问题。有人能告诉我从哪里开始吗?一个给定的标识符有多少关系 如果答案不

我有两个相当大的数据集,每个都是~600GB

第一个签名是:

  • KV
    其中两个
    字符串都表示数据库A中的标识符。它实际上代表了它们之间的一种关系
  • KV
    其中
    String
    数据库A中的标识符,
    Long
    数据库B中的标识符。此关系表示来自数据库A
    String
    如何映射到数据库B中的
    Long
我希望收到带有签名的结果:
KV
,它的大小与
KV
完全相同,但值取自
KV
,它被有效地视为一个巨大的
HashMap


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

一个给定的标识符有多少关系

如果答案不是那么多,您可以使用
CoGroupByKey

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"));
最终列表电子邮件列表=
Arrays.asList(
“艾米”的千伏amy@example.com"),
“卡尔”的千伏电压carl@example.com"),
“朱莉娅”的千伏julia@example.com"),
“卡尔”的千伏电压carl@email.com"));
最终列表电话列表=
Arrays.asList(
KV.of(“艾米”,“111-222-3333”),
KV.of(“詹姆斯”,“222-333-4444”),
KV.(“艾米”,“333-444-5555”),
千伏电压(“卡尔”、“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']; []");
最终列表格式化结果=
Arrays.asList(
“艾米;['amy@example.com']; ['111-222-3333', '333-444-5555']",
“卡尔;['carl@email.com', 'carl@example.com']; ['444-555-6666']",
“詹姆斯;[];['222-333-4444'”,
“朱莉娅;['julia@example.com']; []");
您可以对
KV
中的每个字符串执行两次
CoGroupByKey
。两次都要将其与
KV
配对

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

听起来您可能需要编制自己的
CoGroupByKey
/
GroupByKey
版本,以便在运行时生成值,而不是将它们构建在一个数组中

如果您查看源代码,您将看到
CoGroupByKey
GroupByKey
只是
PTransform
s


平均而言,每个标识符都有两个关系,但实际范围即使高达100k,它们肯定会立即放入内存中,但这只是其中的几个关系。我将尝试深入研究这个CoGroupByKey。我还看到在这种情况下使用了Side输入,但我不知道是否有方法传递它,因为它实际上不适合内存。有没有办法?我不确定。从这个角度看,为了使用pcoll作为侧输入,似乎必须首先将pcoll转换为某种pvalue/view。这个看起来很有趣:但我不知道它能支持多大的dict。java版本的文档也有点缺乏