首页 > 解决方案 > 使用 Apache Beam 读取自定义格式文件

问题描述

我是 Apache Beam 的新手。我需要读取格式如下的文本文件

a=1
b=3
c=2

a=2
b=6
c=5

这里直到空行的所有行都是一条记录的一部分,需要一起处理(例如,作为列插入到表中)。上面的示例对应于一个只有 2 条记录的文件。我正在使用ReadFromText读取文件并进行处理。它将每一行作为一个元素读取。然后我试图循环和处理,直到我得到空行。

ReadFromText 返回一个PCollection,我已经读到 PCollection 是潜在分布式数据集的抽象。我的疑问是在阅读时,我是否会以与文件中相同的顺序获取记录。或者我会得到一个不保留订单的行集合。我可以使用什么解决方案来解决这个问题?

我正在使用python语言。我必须从 GCP 存储桶中读取文件并使用 Google Dataflow 执行。

标签: pythongoogle-cloud-dataflowapache-beam

解决方案


不,不保证您的记录顺序相同。PCollection 本质上是无序的,PCollection 中的元素应该是并行化的,即是不同的并且不依赖于 PCollection 中的其他元素。

在您的示例中,您使用 TextIO 将文本文件的每一行视为一个单独的元素,但您需要将记录的每组数据收集为一个元素。有很多潜在的方法可以解决这个问题。

  1. 如果您可以修改文本文件,则可以将所有数据放在每条记录的一行中,然后在您编写的转换中解析该行。这是通常采用的方法,例如使用 CSV 文件。

  2. 如果您无法修改文件,添加您自己的读取文件逻辑的简单解决方案是使用FileIO检索文件,然后使用您自己的读取文件逻辑编写自定义ParDo。这并不像使用现有 IO 开箱即用那么简单,但仍然比创建功能齐全的 Source 更容易。

  3. 如果文件更复杂并且您需要更强大的解决方案,您可以实现自己的 Source 来读取文件并以所需格式输出记录。这很可能涉及使用Splittable DoFns,并且需要相当多的关于FileBasedSource如何工作的知识。


推荐阅读