Apache Beam从Pub / Sub JSON获取CSV文件

时间:2017-09-26 21:26:17

标签: apache-beam

我将csv文件推送到Google存储空间,并将pubsub订阅通知我,当他们到达时通知我。我想要完成的是编写一个梁程序,它将从pubsub订阅中获取JSON数据,解析出文件位置,然后从GS读取csv文件,然后处理它们。我有一个进程将处理读取pubsub然后将其处理为pcollection。到目前为止,我有这个:

Options options = PipelineOptionsFactory.fromArgs(args).withValidation().as(Options.class);
final String output = options.getOutput();
Pipeline pipeline = Pipeline.create(options);

PCollection<String> input = pipeline.apply(PubsubIO.readStrings().fromSubscription(StaticValueProvider.of("beamsub")));


  PCollection<String> files = input.apply(ParDo.of(new ParseOutGSFiles()));

现在我需要做这样的事情:

pipeline.apply("ReadLines", TextIO.read().from(FILEsFROMEARLIER).withCompressionType(TextIO.CompressionType.GZIP))

任何想法或这是不可能的......似乎应该很容易

提前致谢

1 个答案:

答案 0 :(得分:1)

表达阅读的自然方式是使用TextIO.readAll()方法,该方法从文件名的输入PCollection中读取文本文件。此方法已在Beam代码库中引入,但目前尚未发布。它将包含在Beam 2.2.0版本和相应的Dataflow 2.2.0版本中。

您的结果代码看起来像

Options options = PipelineOptionsFactory.fromArgs(args)
    .withValidation().as(Options.class);
final String output = options.getOutput();
Pipeline pipeline = Pipeline.create(options);

PCollection<String> files = pipeline
    .apply(PubsubIO.readStrings().fromSubscription("beamsub"))
    .apply(ParDo.of(new ParseOutGSFiles()));
PCollection<String> contents = files
    .apply(TextIO.readAll().withCompressionType(TextIO.CompressionType.GZIP));