![](/img/trans.png)
[英]How do I set the coder for a PCollection<List<String>> in Apache Beam?
[英]Apache Beam TextIO.ReadAll How to emit KeyValue instead of String of Pcollection
管道从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
函数内部的路径读取文件以将路径映射到行的方法。
希望这很清楚。
如果我正确理解了这个问题,我认为TextIO
不支持此功能。
细节
当您应用类似readAll()
转换时,在从IO获取初始文件路径和最后从所有文件发出所有行之间,涉及两个步骤。
例如, TextIO
的逻辑:
PCollection
; FileIO.matchAll()
将路径模式的PCollection
转换为描述这些路径的MatchResult.Metadata
对象的PCollection
。 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
的一个很短的包装器,实现了我上面提到的步骤 ; expand()
的最后一步中 ,您将应用自定义逻辑来发出所需的KVs
,而不是readFiles()
:
readFiles()
由ReadAllViaFileBasedSource
实现 ; ReadAllViaFileBasedSource
似乎是将ReadableFiles
转换为字符串的实际事物; ReadAllViaFileBasedSource
的副本并更改输出逻辑,以便不仅发出文件,还发出元数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.