我有一个KV的PCollection,其中key是文件名,value是文件的一些附加信息(例如,生成文件的“ Source”系统)。例如,
KV("gs://bucket1/dir1/X1.dat", "SourceX"),
KV("gs://bucket1/dir2/Y1.dat", "SourceY")
我需要从文件中读取所有行,并带有“源”字段,以KV PCollection的形式返回。
KV(line1 from X1.dat, "SourceX")
KV(line2 from X1.dat, "SourceX")
...
KV(line1 from Y1.dat, "SourceY")
我能够通过调用FileIO.match()并随后执行DoFn来实现此目的,在该DoFn中,我依次读取文件并附加SourceX(从SideInput中传递的映射中检索)。
要获得并行阅读的好处,我可以使用TextIO.readAll()来实现这一点吗? TextIO.read()返回一个PCollection,不带文件名信息。如何将其重新加入Filename到Source的映射?尝试了WithKeys传输,但不起作用...
答案 0 :(得分:0)
如果我理解正确,您是否想并行读取文件?不幸的是,TextIO.readAll
没有此功能。您将必须使用FileIO.match
,然后编写DoFn
才能以所需的自定义方式读取文件。
这是因为您将无法对文件进行随机查找并保留行号计数。
串行读取文件是否是您的管道的瓶颈?
答案 1 :(得分:0)
当前使用FileIO.match()
是实现此目的的最佳方法,但是一旦合并https://github.com/apache/beam/pull/12645,您将可以使用新的ContextualTextIO
转换。
请注意,以分布式方式计算行号本质上很昂贵;您可能想看看是否可以使用偏移量(计算起来更容易,并且与行号相同)。