我正在运行以下数据流代码作为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,它们将被输出到输出文件。
如何使用随机字符串生成数百万条记录。在这种情况下,数据流实际上不需要任何输入源。它应该只能转换一些种子字符串和输出。
答案 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());
}
}