python - 使用 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 执行。
解决方案
不,不保证您的记录顺序相同。PCollection 本质上是无序的,PCollection 中的元素应该是并行化的,即是不同的并且不依赖于 PCollection 中的其他元素。
在您的示例中,您使用 TextIO 将文本文件的每一行视为一个单独的元素,但您需要将记录的每组数据收集为一个元素。有很多潜在的方法可以解决这个问题。
如果您可以修改文本文件,则可以将所有数据放在每条记录的一行中,然后在您编写的转换中解析该行。这是通常采用的方法,例如使用 CSV 文件。
如果您无法修改文件,添加您自己的读取文件逻辑的简单解决方案是使用FileIO检索文件,然后使用您自己的读取文件逻辑编写自定义ParDo。这并不像使用现有 IO 开箱即用那么简单,但仍然比创建功能齐全的 Source 更容易。
如果文件更复杂并且您需要更强大的解决方案,您可以实现自己的 Source 来读取文件并以所需格式输出记录。这很可能涉及使用Splittable DoFns,并且需要相当多的关于FileBasedSource如何工作的知识。
推荐阅读
- c# - SQL Server to .Net Decimals with EF6 dDatabase 第一个问题
- android - certificatePinner 无法使用 okhttp 抛出 SSLHandshakeException:CertPathValidatorException 未找到证书路径的信任锚
- vb.net - VB 表达式帮助在 UiPath 中搜索抓取的数据
- excel - 列到行(形成新行)
- python - 如何根据第一个值Python替换已排序的元组列表中的元组
- r - R 有 Zlib 吗?原始膨胀函数 - 如何解压缩十六进制值
- angular - 有没有办法在 ng For 中搜索
- c# - 如何发布包含 Iformfile 的视图模型数组的表单?
- php - 按 id 合并数组并考虑具有重复关联索引的唯一值
- laravel-5.5 - 创建付款时不重定向到付款页面