python - 从 Python 中的 DataFlow 读取 snappy 或 lzo 压缩文件
问题描述
有没有办法使用 Apache Beam 的 Python SDK 在 DataFlow 上读取 snappy 或 lzo 压缩文件?
由于我找不到更简单的方法,这是我目前的方法(这似乎完全过分且效率低下):
- 启动 DataProc 集群
- 在新集群中使用 hive 解压此类数据并将其放置在临时位置
- 停止 DataProc 集群
- 运行从这些临时未压缩数据中读取的 DataFlow 作业
- 清理临时未压缩数据
解决方案
我不认为今天有任何内置的方式可以用梁做到这一点。Python 束支持 Gzip、bzip2 和 deflate。
选项1:读入整个文件并手动解压缩
- 创建一个自定义源以生成文件名列表(即通过列出目录从管道选项中播种),并将这些作为记录发出
- 在下面的 ParDo 中,手动读取每个文件并解压缩。如果您已将数据存储在那里,您将需要使用 GCS 库来读取 GCS 文件。
此解决方案的执行速度可能不会那么快,并且无法将大文件加载到内存中。但是,如果您的文件很小,它可能工作得很好。
选项 2:为 Beam 添加一个新的解压器。
您也许可以为 beam贡献一个减压器。看起来您需要实现解压缩器逻辑,在创作管道时提供一些常量来指定它。
我认为其中一个限制是必须可以扫描文件并一次将其解压缩成块。如果压缩格式需要将整个文件读入内存,那么它可能不起作用。这是因为 TextIO 库被设计为基于记录的,它支持读取不适合内存的大文件并将它们分解为小记录进行处理。