使用Google Cloud Dataflow生成大型文件

时间:2017-03-16 15:55:13

标签: google-cloud-platform google-cloud-dataflow

我正在运行以下数据流代码作为JUnit测试类

的一部分
@Test
public void dataFlowGenerator() {
  DataflowPipelineOptions options = PipelineOptionsFactory.create().as(DataflowPipelineOptions.class);
  options.setRunner(BlockingDataflowPipelineRunner.class);
  options.setStagingLocation("gs://mybucket/lt");
  options.setProject("myProject");
  Pipeline p = Pipeline.create(options);

  List<String> list = Arrays.asList("sup1", "sup2", "sup3");
  p.apply(Create.of(list)).apply(ParDo.of(new generate())).apply(
      TextIO.Write.to("gs://mybucket/lt/df.txt"));
}


private class generate extends DoFn<String, String> implements Serializable {

  @Override
  public void processElement(ProcessContext c) throws Exception {
    new DoFn<String, String>() {
      @Override
      public void processElement(ProcessContext c) {
        c.output(c.element());
      }
    };
  }
}

这不会在云存储中提到的文件中输出任何内容(只是空文件df.txt-00000-of-00001)。我期望将为列表中的每个字符串项调用processElement,它们将被输出到输出文件。

如何使用随机字符串生成数百万条记录。在这种情况下,数据流实际上不需要任何输入源。它应该只能转换一些种子字符串和输出。

1 个答案:

答案 0 :(得分:1)

两件事:

首先,您根本不需要这样做ParDo。您的转换只是身份转换 - 您只需将Create的输出直接输入TextIO.Write

但我还想澄清为什么你没有看到goutput:你的DoFn子类有processElement方法创建另一个DoFn并且只丢弃该值。你可能想写这个:

private class Generate extends DoFn<String, String> implements Serializable {

  @Override
  public void processElement(ProcessContext c) throws Exception {
    c.output(c.element());
  }
}