从 Dataflow 中的压缩文件中读取

Reading from compressed files in Dataflow

有没有办法(或任何一种技巧)从压缩文件中读取输入数据? 我的输入包含数百个文件,这些文件是用 gzip 压缩生成的,解压缩它们有些乏味。

我还发现,对于驻留在云存储中的文件,设置内容类型和内容编码似乎 "just work" 不需要解决方法。

具体来说 - 我 运行

gsutil -m setmeta -h "Content-Encoding:gzip" -h "Content-Type:text/plain" <path>

我的解决方案性能较慢很可能是因为 Dataflow 将大部分文件放在同一个拆分中,因此它们没有被并行处理。您可以尝试以下方法来加快速度。

  • 通过多次应用创建转换(每次对单个文件)为每个文件创建一个 PCollection。
  • 使用 Flatten 转换创建单个 PCollection,其中包含代表单个文件的 PCollections 中的所有文件。
  • 将您的管道应用于此 PCollection。

Dataflow 现在支持从压缩文本源读取(从 this commit 开始)。具体来说,可以通过指定压缩类型来读取gzip和bzip2压缩的文件:

TextIO.Read.from(myFileName).withCompressionType(TextIO.CompressionType.GZIP)

但是,如果文件的扩展名为 .gz 或 .bz2,则您无需执行任何操作:默认压缩类型为 AUTO,它会检查文件扩展名以确定文件的正确压缩类型。这甚至适用于 glob,其中由 glob 生成的文件可能是 .gz、.bz2 和未压缩文件的混合。

我刚刚注意到指定压缩类型现在可以在最新版本的 SDK (v0.3.150210) 中使用。我已经对其进行了测试,并且能够毫无问题地将我的 GZ 文件直接从 GCS 加载到 BQ。