首页 > 解决方案 > 从 Python 中的 DataFlow 读取 snappy 或 lzo 压缩文件

问题描述

有没有办法使用 Apache Beam 的 Python SDK 在 DataFlow 上读取 snappy 或 lzo 压缩文件?

由于我找不到更简单的方法,这是我目前的方法(这似乎完全过分且效率低下):

标签: pythongoogle-cloud-platformgoogle-cloud-dataflowapache-beam

解决方案


我不认为今天有任何内置的方式可以用梁做到这一点。Python 束支持 Gzip、bzip2 和 deflate。

选项1:读入整个文件并手动解压缩

  1. 创建一个自定义源以生成文件名列表(即通过列出目录从管道选项中播种),并将这些作为记录发出
  2. 在下面的 ParDo 中,手动读取每个文件并解压缩。如果您已将数据存储在那里,您将需要使用 GCS 库来读取 GCS 文件。

此解决方案的执行速度可能不会那么快,并且无法将大文件加载到内存中。但是,如果您的文件很小,它可能工作得很好。

选项 2:为 Beam 添加一个新的解压器。

您也许可以为 beam贡献一个减压器。看起来您需要实现解压缩器逻辑,在创作管道时提供一些常量来指定它。

我认为其中一个限制是必须可以扫描文件并一次将其解压缩成块。如果压缩格式需要将整个文件读入内存,那么它可能不起作用。这是因为 TextIO 库被设计为基于记录的,它支持读取不适合内存的大文件并将它们分解为小记录进行处理。


推荐阅读