将单个PCollection拆分为多个(动态数量)PCollections,然后对每个集合进行计算

时间:2018-03-16 08:56:41

标签: java google-cloud-dataflow apache-beam

我有一个无限制的集合,从PubsubIO读取数据,称为Trade格式,如

{
  timestamp: 123,
  type: "",
  side: "" // sell or buy
  volume: 123.12,
  location: ""
}

type个,{40}个以上location个,其关系为n <=> n

我的任务是按sidetypelocation计算10分钟和60分钟类别的交易量,同时根据类型计算总交易量。所以,输出应该是4个东西的集合,每个集合为10分钟和60分钟,对于销售和购买,称为TotalTrade,如

{
  total: 123,
  type: "",
  location: "",
}

到目前为止我尝试了什么。

  1. 根据交易的哪一方
  2. 将该集合分为2个集合

    我处理的每个集合

    1. 将收藏品藏在固定的窗户中10分钟
    2. ParDo进入type Trade
    3. 的KV
    4. GroupByKey所以我们收集了KV<String, Iterable<Trade>>
    5. 应用自定义ParDo会计算Iterable<Trade>中每个位置的总音量,因此输出为KV<String, Iterable<KV<String, TotalTrade>>>
    6. ...
    7. 问题在于自定义Pardo步骤。我必须按位置手动分组Trade,计算总数然后输出结果。对我来说,这不是拥抱Apache Beam或Google Dataflow的并行模型。

      所以我的问题是有没有办法将一个集合分支到Beam模型中的动态数字集合中。例如,我的问题可以通过以下转换来解决。

      1. 根据type
      2. Trade将集合转换为集合
      3. 根据location
      4. 将每个集合转换为集合
      5. 合并变换以计算TotalTrade
      6. 现在我们按TotalTradelocation

        分类type
        1. 对第4步中的每组收集进行展平变换。
        2. 对每个集合进行组合
        3. 现在我们的总量基于type

1 个答案:

答案 0 :(得分:1)

如果在管道创建期间动态数字不可用,则无法将集合分支到动态数量的集合中。图表/步骤在管道的开头设置,不能更改。

如果你有很多动态数字,你可以尝试用id输出结果和分组。但是,如果你没有很多id并且确实有很多值,你会得到一些热键(所有的id都必须由1个worker处理)。