如何使用TextIO读取文本文件并返回其他输入字段?

时间:2019-03-01 06:46:34

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

我有一个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传输,但不起作用...

2 个答案:

答案 0 :(得分:0)

如果我理解正确,您是否想并行读取文件?不幸的是,TextIO.readAll没有此功能。您将必须使用FileIO.match,然后编写DoFn才能以所需的自定义方式读取文件。

这是因为您将无法对文件进行随机查找并保留行号计数。

串行读取文件是否是您的管道的瓶颈?

答案 1 :(得分:0)

当前使用FileIO.match()是实现此目的的最佳方法,但是一旦合并https://github.com/apache/beam/pull/12645,您将可以使用新的ContextualTextIO转换。

请注意,以分布式方式计算行号本质上很昂贵;您可能想看看是否可以使用偏移量(计算起来更容易,并且与行号相同)。