繁体   English   中英

Apache Beam TextIO.ReadAll如何发出KeyValue而不是Pcollection的字符串

[英]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

稍微详细一点:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM