Java Apache Beam TextIO glob获取原始文件名

Java Apache Beam TextIO glob获取原始文件名,java,google-cloud-dataflow,clob,apache-beam,Java,Google Cloud Dataflow,Clob,Apache Beam,我已经建立了一个管道。我必须解析数百个*.gz文件。因此glob工作得相当好 但是我需要当前处理的文件的原始名称,因为我想将结果文件命名为原始文件 有人能帮我吗 这是我的密码 @Default.String(LOGS_PATH + "*.gz") String getInputFile(); void setInputFile(String value); TextIO.Read read = TextIO.read().withCompressionType(TextIO.Comp

我已经建立了一个管道。我必须解析数百个*.gz文件。因此glob工作得相当好

但是我需要当前处理的文件的原始名称,因为我想将结果文件命名为原始文件

有人能帮我吗

这是我的密码

@Default.String(LOGS_PATH + "*.gz")
String getInputFile();
void setInputFile(String value);


    TextIO.Read read = TextIO.read().withCompressionType(TextIO.CompressionType.GZIP).from(options.getInputFile());
        read.getName();

        p.apply("ReadLines", read).apply(new CountWords())
         .apply(MapElements.via(new FormatAsTextFn()))
         .apply("WriteCounts", TextIO.write().to(WordCountOptions.LOGS_PATH + "_" + options.getOutput()));

    p.run().waitUntilFinish();

这可以从Beam 2.2开始,结合使用
FileIO.match()
FileIO.read()
和自定义代码来读取文本行。您可以先使用它,也可以等到2.2版完成(目前正在进行中)

PCollection filesAndLines=
p、 应用(FileIO.match().filepattern(…)
.apply(FileIO.read())
.适用(新DoFn()的第{
@过程元素
公共作废流程(ProcessContext c){
可读文件f=c.element();
字符串文件名=f.getMetadata().resourceId().toString();
弦线;
try(BufferedReader r=newbufferedreader(Channels.newInputStream(f.open())){
而((line=r.readLine())!=null){
c、 输出(文件名、行的千伏);
}
}
}
}));

您是否知道现在有没有一种简单的方法来解决python的问题?使用您的解决方案,最终输出是一个键值对。为了将实际的行(值)写入相应的文件(键),我是否需要自定义接收器?还是有更好的方法来指定需要编写的内容?
PCollection<KV<String, String>> filesAndLines = 
  p.apply(FileIO.match().filepattern(...))
   .apply(FileIO.read())
   .apply(ParDo.of(new DoFn<ReadableFile, KV<String, String>>() {
     @ProcessElement
     public void process(ProcessContext c) {
       ReadableFile f = c.element();
       String filename = f.getMetadata().resourceId().toString();
       String line;
       try (BufferedReader r = new BufferedReader(Channels.newInputStream(f.open()))) {
         while ((line = r.readLine()) != null) {
           c.output(KV.of(filename, line));
         }
       }
     }
   }));