首页 > 解决方案 > 使用 Apache Beam 查找 2 个列表的笛卡尔积

问题描述

我有 2PCollection秒:

PCollection<List<String>> ListA =
        pipeline.apply("getListA", ParDo.of(new getListA()))
PCollection<List<String>> ListB =
        pipeline.apply("getListB", ParDo.of(new getListB()))

ListA包含:

["1","2","3"]

ListB包含:

["A","B","C"]

我如何最终得到一个PCollection包含:

[
 ["A","1"],["A","2"],["A","3"],
 ["B","1"],["B","2"],["B","3"],
 ["C","1"],["C","2"],["C","3"],
]

我的搜索指出:

如何在 Dataflow 中做两个 PCollection 的笛卡尔积?

但这是使用具有 2 个输出的 coGroupby 处理 KV。coGroupby 有可能用于创建 2 个列表的笛卡尔积,但我没有看到它。

标签: javalistcollectionsapache-beamcartesian-product

解决方案


看起来你在每个 PCollection 中都有一个元素,所以你只需要加入这些元素,然后你就可以在 DoFn 中自己做笛卡尔积

就像是

Flatten.pcollections(ListA, List)
.apply(WithKeys.of(null))
.apply(GroupByKey.create())

之后,您将拥有一个包含单个元素的 PCollection,即 KV(null, Iterable(ListA, ListB)),您可以使用一些 for 循环生成笛卡尔积。


推荐阅读