【问题标题】:How to get the cartesian product of two PCollections如何获得两个 PCollection 的笛卡尔积
【发布时间】:2016-01-26 07:24:23
【问题描述】:

我对使用 Google Cloud Dataflow 非常陌生。我想得到两个 PCollection 的笛卡尔积。例如,如果我有两个 PCollection (1, 2)("hello", "world"),它们的笛卡尔积是 ((1, "hello"), (1, "world"), (2, "hello"), (2, "world"))

任何想法我怎么能做到这一点?此外,由于笛卡尔积可能很大,我希望该解决方案能够懒惰地创建产品,从而避免巨大的内存消耗。

谢谢!

【问题讨论】:

  • 你有更多关于你想要做什么的细节吗?每个 PCollections 有多大?有几种方法可以实现这一点,哪一种更好取决于您想要笛卡尔积的原因以及所涉及的实际 PCollections。
  • 这两个 PCollection 是相同的。它们都包含大约 100,000 个 (String, String) 类型的元组。我正在使用英语单词词典并获取它们的音标以生成 2 词双关语,例如:“fantasti-CAL-ifornia”。
  • 对于直接笛卡尔解决方案,this 似乎是目前可用的最佳答案。

标签: google-cloud-dataflow


【解决方案1】:

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

这将每次重新迭代整个单词集——如果它适合内存,那应该没问题。如果每次都必须重新获取侧面输入数据,这可能会出现问题。

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

【讨论】:

  • 感谢您的意见!我可能会使用GroupByKey 方法!
  • 这实际上并没有回答如何做笛卡尔积的问题。
  • 我其实期待看到一个实际的解决方案
猜你喜欢
  • 1970-01-01
  • 2015-07-29
  • 1970-01-01
  • 2023-02-19
  • 2015-10-21
  • 2012-01-03
  • 2017-03-05
  • 1970-01-01
  • 2012-05-23
相关资源
最近更新 更多