Google cloud dataflow 对来自CSV的数据进行分区,以便我可以处理更大的补丁,而不是单独的行

Google cloud dataflow 对来自CSV的数据进行分区,以便我可以处理更大的补丁,而不是单独的行,google-cloud-dataflow,Google Cloud Dataflow,我刚刚开始使用Google Data Flow,我编写了一个简单的流程,可以从云存储中读取CSV文件。其中一个步骤涉及调用web服务以丰富结果。当批量发送几个100个请求时,所讨论的web服务的性能要好得多 在查看API时,我看不到将pCype的100个元素聚合为单个PAR.DO执行的好方法。然后需要对结果进行拆分,以处理流的最后一步,即写入BigQuery表 不确定我是否需要使用窗口是我想要的。我看到的大多数窗口示例更倾向于在给定的时间段内进行计数。您可以在DoFn的本地成员变量中缓冲元素,并

我刚刚开始使用Google Data Flow,我编写了一个简单的流程,可以从云存储中读取CSV文件。其中一个步骤涉及调用web服务以丰富结果。当批量发送几个100个请求时,所讨论的web服务的性能要好得多

在查看API时,我看不到将pCype的100个元素聚合为单个PAR.DO执行的好方法。然后需要对结果进行拆分,以处理流的最后一步,即写入BigQuery表


不确定我是否需要使用窗口是我想要的。我看到的大多数窗口示例更倾向于在给定的时间段内进行计数。

您可以在DoFn的本地成员变量中缓冲元素,并在缓冲区足够大时调用web服务,以及在finishBundle中。例如:

class CallServiceFn extends DoFn<String, String> {
  private List<String> elements = new ArrayList<>();

  public void processElement(ProcessContext c) {
    elements.add(c.element());
    if (elements.size() >= MAX_CALL_SIZE) {
      for (String result : callServiceWithData(elements)) {
        c.output(result);
      }
      elements.clear();
    }
  }

  public void finishBundle(Context c) {
    for (String result : callServiceWithData(elements)) {
      c.output(result);
    }
  }
}
class CallServiceFn扩展了DoFn{
私有列表元素=新的ArrayList();
公共void processElement(ProcessContext c){
添加(c.element());
if(elements.size()>=最大调用大小){
for(字符串结果:callServiceWithData(元素)){
c、 输出(结果);
}
元素。清除();
}
}
公共void finishBundle(上下文c){
for(字符串结果:callServiceWithData(元素)){
c、 输出(结果);
}
}
}

请注意,添加了一个转换以使此过程更加简单。

将数据返回管道的最佳方式是什么。我的服务返回一个结果数组列表,理想情况下,我希望将结果集切分为各个元素。我编辑了帖子,以显示运行批处理应用程序时从服务调用输出的结果,DoFn.finishBundle()是否方法在达到一定数量的记录或整个数据集的生命周期时运行?我假设您正在使用finishBundle捕获剩余的任何记录。finishBundle在每个元素包的末尾被调用。捆绑包的大小未指定,但在批处理管道中,大致对应于一个工作线程的数据共享。我试图在python中复制此代码,但不确定如何正确清除列表。例如,在
process()。