管道从读取PUBSUBIo开始。 PubSub IO内的消息是GCS文件路径。我知道我可以使用ReadAll()
从每条路径发出线。但是,它不符合我的目的(有关文件路径的信息丢失了)。我需要发出的是KV<'Filepath','Lines inside files'>
。
PubSUB消息看起来像
Message1 -> gs://folder1/Topic1/topicfile1.gz
Message2 -> gs://folder1/Topic2/topicfile2.gz
假设文件内容如下所示
topicfile1.gz
{
topic1.line1
topic1.line2
}
topicfile2.gz
{
topic2.line1
topic2.line2
}
我期望的是像下面这样的收藏集
{KV<'gs://folder1/Topic1/topicfile1.gz','topic1.line1'>}
{KV<'gs://folder1/Topic1/topicfile1.gz','topic1.line2'>}
{KV<'gs://folder1/Topic2/topicfile2.gz','topic2.line1'>}
{KV<'gs://folder1/Topic2/topicfile2.gz','topic2.line2'>}
我找不到从ParDo
函数内部的路径读取文件以将路径映射到行的方法。
希望这很清楚。
答案 0 :(得分:0)
如果我正确理解了这个问题,我认为TextIO
内的功能不被支持。
详细信息
当您应用readAll()
之类的转换时,从IO获取初始文件路径与最后从所有文件发出所有行之间需要涉及几个步骤。
例如,逻辑in TextIO
:
PCollection
个文件路径(或路径模式); FileIO.matchAll()
将路径模式的PCollection
转换成描述这些路径的PCollection
对象的MatchResult.Metadata
; FileIO.readMatches()
将元数据对象转换为描述特定文件的ReadableFile
对象; TextIO.readFiles()
并接受ReadableFile
并输出该文件中的所有字符串;
KV<ReadableFile, String>
而不是字符串,那么这将有帮助,这样您就可以使用ReadableFile.metadata
访问文件路径。看看这段代码,看来从文件中发出原始行是目前唯一支持的使用TextIO
的处理方式。
解决方法
最简单的方法可能是编写自己的PTransform
,类似于TextIO.ReadAll
。这样会起作用:
高级:
TextIO.ReadAll
; ReadAllViaFileBasedSource
中的ReadAllViaFileBasedSource
的版本以发出所需的内容; TextIO.ReadAll
的自定义版本,该版本使用发出正确内容的自定义版本ReadAllViaFileBasedSource
; 稍微详细一点:
TextIO.ReadAll
,这就是我上面提到的FileIO
that implements the steps的很短的包装; expand()
,at the last step中,您将应用自定义逻辑来发出所需的readFiles()
,而不是KVs
:
readFiles()
现在是implemented by ReadAllViaFileBasedSource
; ReadAllViaFileBasedSource
似乎是converts ReadableFiles
into strings的真实事物; ReadAllViaFileBasedSource
的副本并更改输出逻辑,以便不仅发出文件,还发出元数据;