如何获得两个 PCollections 的笛卡尔积

How to get the cartesian product of two PCollections

我刚开始使用 Google Cloud Dataflow。我想获得两个 PCollections 的笛卡尔积。例如,如果我有两个 PCollections (1, 2)("hello", "world"),它们的笛卡尔积是 ((1, "hello"), (1, "world"), (2, "hello"), (2, "world"))

有什么办法可以做到吗?此外,由于笛卡尔积可能很大,我希望解决方案能够延迟创建积,从而避免大量内存消耗。

谢谢!

一般来说,计算笛卡尔积的成本很高。如果其中一个(或两个)集合适合内存,您可以使用 side-inputs 将数据广播给所有工作人员。因此,对于您的示例,您会将 PCollection<String> 变成辅助输入,然后您将拥有一个将其作为主要输入的 ParDo。对于主输入上的每个字符串,您可以访问具有所有值的 Iterable<String> 的 side-input,然后输出这些对(或者您可以在此 DoFn 中选择只输出对齐的对)。

这将 re-iterate 每次都遍历整组单词——如果它适合记忆,那应该没问题。如果每次都必须re-fetch侧输入数据可能会有问题。

另一种方法是依靠洗牌和密钥。假设您想查找具有 3 个字母重叠的单词。您可以处理字典并生成 PCollection 个由 3 个字母前缀键入的值。您还可以创建由 3 个字母后缀键入的类似 PCollection。然后你可以GroupByKey(或CoGroupByKey)。之后,对于每个 3 个字母的键,所有以那个为前缀和以那个为后缀的单词。