Google cloud dataflow 访问文件名中的信息(元数据)&;在梁管道中键入

Google cloud dataflow 访问文件名中的信息(元数据)&;在梁管道中键入,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我的文件名包含我在管道中需要的信息,例如,我的数据点的标识符是文件名的一部分,而不是数据中的字段。e、 g每台风力涡轮机生成一个文件turbine-loc-001-007.csv。e、 g和我需要管道中的loc数据。Java(sdk 2.9.0): Beams TextIO阅读器不允许访问文件名本身,对于这些用例,我们需要使用FileIO来匹配文件,并获得对文件名中存储的信息的访问。与TextIO不同,用户需要在FileIO读取的下游处理文件的读取。FileIO读取的结果是PCollection

我的文件名包含我在管道中需要的信息,例如,我的数据点的标识符是文件名的一部分,而不是数据中的字段。e、 g每台风力涡轮机生成一个文件turbine-loc-001-007.csv。e、 g和我需要管道中的loc数据。

Java(sdk 2.9.0):

Beams TextIO阅读器不允许访问文件名本身,对于这些用例,我们需要使用FileIO来匹配文件,并获得对文件名中存储的信息的访问。与TextIO不同,用户需要在FileIO读取的下游处理文件的读取。FileIO读取的结果是PCollection ReadableFile类包含文件名作为元数据,可以与文件内容一起使用

FileIO有一个方便的方法readFullyAsUTF8String(),它将整个文件读入一个String对象,这将首先将整个文件读入内存。如果内存是一个问题,那么您可以使用诸如文件系统之类的实用程序类直接处理该文件

发件人:

PCollection<KV<String, String>> filesAndContents = p
     .apply(FileIO.match().filepattern("hdfs://path/to/*.gz"))
     // withCompression can be omitted - by default compression is detected from the filename.
     .apply(FileIO.readMatches().withCompression(GZIP))
     .apply(MapElements
         // uses imports from TypeDescriptors
         .into(KVs(strings(), strings()))
         .via((ReadableFile f) -> KV.of(
             f.getMetadata().resourceId().toString(), f.readFullyAsUTF8String())));
import apache_beam as beam
from apache_beam.io import fileio

with beam.Pipeline() as p:
  readable_files = (p 
                    | fileio.MatchFiles(‘hdfs://path/to/*.txt’)
                    | fileio.ReadMatches()
                    | beam.Reshuffle())
  files_and_contents = (readable_files 
                        | beam.Map(lambda x: (x.metadata.path, 
                                              x.read_utf8()))