【问题标题】:How do I perform a Union in Dataflow?如何在 Dataflow 中执行联合?
【发布时间】:2015-02-12 20:11:20
【问题描述】:

我正在尝试在 Dataflow 中执行联合操作。是否有在 Dataflow 中合并两个 PCollection 的示例代码?

【问题讨论】:

    标签: google-cloud-dataflow


    【解决方案1】:

    一个简单的方法是像这样将 Flatten() 与 RemoveDuplicates() 结合起来。根据您想要不相交联合还是集合论联合,可以省略 RemoveDuplicates 调用:

    PCollection<String> pc1 = ...;
    PCollection<String> pc2 = ...;
    PCollection<String> union = PCollectionList.of(pc1).and(pc2)
      .apply(Flatten.<String>pCollections())
      .apply(RemoveDuplicates.<String>create());
    

    【讨论】:

    • 我想知道在 Flatten 之前添加另一个 RemoveDuplicates 是否是个好主意,以防每个集合中也可能存在重复项?即 PCollectionList.of(pc1.apply(RemoveDuplicates)).and(pc2.apply(RemoveDuplicates)) - 还是优化器会处理这个问题?
    • 我认为“Flatten..create”应该是“Flatten.create”
    • @jkff 当前的优化器不会处理这个问题,所以你最终会得到两个洗牌而不是一个。
    • @SamMcVeety 看起来“RemoveDuplicates”现在已更改为“Distinct”。我正在使用 Beam 2.4
    【解决方案2】:

    如果你有两个以上的集合,一个方便的解决方案是填充一个 PCollection 列表,基于它和 Flatten 创建一个 PCollectionList:

    List<PCollection<TableRow>> tabs = new ArrayList<>();
    /* ... fill tabs */
    PCollectionList<TableRow> tabList = PCollectionList.of(tabs);
    PCollection<TableRow> bigOne = tabList.apply(Flatten.<TableRow>create());
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2018-11-28
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-20
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多