Apache Beam获取源文件名

时间:2016-12-08 00:12:58

标签: java google-cloud-dataflow apache-beam

编辑:已解决!

我有多种语言的多个文本文件。我想使用Apache Beam为每一行添加语言标记。

示例:

文件 text_en This is a sentence.

文件 text_de Dies ist ein Satz.

我想要的是:

en: This is a sentence.
de: Dies ist ein Satz. 

我尝试了什么:

我最初尝试使用一个TextIO.Read.From(dataSetDirectory+"/*")并查找类似于.getSource()的选项。但是,这似乎并不存在。

接下来,我尝试逐个阅读每个文件:

File[] files = new File(datasetDirectory).listFiles();
PCollectionList<String> dataSet=null;
for (File f: files) {
   String language = f.getName();
   logger.debug(language);
   PCollection<String> newPCollection = p.apply(
            TextIO.Read.from(f.getAbsolutePath()))
               .apply(ParDo.of(new LanguageTagAdder(language)));

   if (dataSet==null) {
       dataSet=PCollectionList.of(newPCollection);
   } else {
       dataSet.and(newPCollection);
   }
}
PCollection<String> completeDataset= dataSet.apply(Flatten.<String>pCollections())

以这种方式阅读文件非常合适,但我的DoFn LanguageTagAdder仅使用第一种语言进行初始化,因此所有文件都具有相同的添加语言。

LanguageTagAdder看起来像这样:

public class LanguageTagAdder
            extends DoFn<String,String> {

        private String language;
        public LanguageTagAdder(String language) {
            this.language=language;
        }
        @ProcessElement
        public void processElement(ProcessContext c) {
            c.output(language+c.element());
        }
    }

我意识到这种行为是有目的的,因此数据可以并行化,但我将如何解决我的问题呢?是否有 Beam - 解决它?

PS:我第二次创建new LanguageTagAdder时会收到以下警告(使用第二种语言):

DEBUG   2016-12-05 17:09:55,070 [main] de.kdld16.hpi.FusionDataset  - en
DEBUG   2016-12-05 17:09:56,216 [main] de.kdld16.hpi.FusionDataset  - de
WARN    2016-12-05 17:09:56,219 [main] org.apache.beam.sdk.Pipeline  - Transform TextIO.Read2 does not have a stable unique name. This will prevent updating of pipelines.

修改 问题是这一行

dataSet.and(newPCollection);

需要重写为:

dataSet=dataSet.and(newPCollection);

就是这样,dataSet只包含第一个文件....难怪他们都有相同的语言标签!

1 个答案:

答案 0 :(得分:2)

问题就在这一行

dataSet.and(newPCollection);

需要重写为:

dataSet=dataSet.and(newPCollection);

就是这样,dataSet只包含第一个文件。