如何获得两个 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 个字母的键,所有以那个为前缀和以那个为后缀的单词。
我刚开始使用 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 个字母的键,所有以那个为前缀和以那个为后缀的单词。