Google cloud dataflow Beam/Dataflow读取拼花地板文件,并向每个记录添加文件名/路径

Google cloud dataflow Beam/Dataflow读取拼花地板文件,并向每个记录添加文件名/路径,google-cloud-dataflow,apache-beam,parquet,Google Cloud Dataflow,Apache Beam,Parquet,我使用的是ApacheBeam Python SDK,我尝试使用Apache_Beam.io.parquetio从拼花文件中读取数据,但我还想将文件名(或路径)添加到数据中,因为它也包含数据。我看了一下建议的模式,读到Parquetio类似于fileio,但它似乎没有实现允许检查文件并将其添加到聚会中的功能 有人想出了一个好办法来实现这一点吗 谢谢 如果文件数量不是很大,则可以在通过IO读取之前获取所有文件 import glob filelist = glob.glob('/tmp/*.pa

我使用的是ApacheBeam Python SDK,我尝试使用
Apache_Beam.io.parquetio
从拼花文件中读取数据,但我还想将文件名(或路径)添加到数据中,因为它也包含数据。我看了一下建议的模式,读到Parquetio类似于fileio,但它似乎没有实现允许检查文件并将其添加到聚会中的功能

有人想出了一个好办法来实现这一点吗


谢谢

如果文件数量不是很大,则可以在通过IO读取之前获取所有文件

import glob

filelist = glob.glob('/tmp/*.parquet')
p = beam.Pipeline()

class PairWithFile(beam.DoFn):
    def __init__(self, filename):
        self._filename = filename

    def process(self, e):
        yield (self._filename, e)

file_with_records = [
    (p 
     | 'Read %s' % (file) >> beam.io.ReadFromParquet(file)
     | 'Pair %s' % (file) >> beam.ParDo(PairWithFile(file)))
    for file in filelist 
] | beam.Flatten()
然后您的PCollection如下所示:


您使用哪个SDK?@AlexeyRomanenko-Python!非常感谢。文件的数量不是很大,但每个文件都相当大。可以用这种方式并行读取文件吗(在遍历文件列表时)?在这里使用“展平”难道没有惩罚吗?而且,这似乎不起作用-文件列表中的最后一项被添加到所有记录中,读取是并行的。文件大小无关紧要,因为读取文件仍然由IO连接器完成。列表理解没有任何作用。它只是构建管道的形状。在梁中管道施工后,所有施工均推迟。展平将多个PCollection对象合并到单个逻辑PCollection中。应该不会有太多的惩罚。我已经编辑了原始代码片段。原始代码的问题在于,延迟执行只在beam.Map()的lambda中考虑文件名的最后一个状态。通过更改,文件名被封装到ParDo的定义中,以便文件名可以用于延迟执行。太棒了!非常感谢。