Google Cloud Dataflow(Apache Beam) - 如何使用标头处理gzip压缩文件?

时间:2017-08-07 19:34:58

标签: google-cloud-dataflow apache-beam

我在GCS中有csv(gzip压缩)文件。我想读取这些文件并将数据发送到BigQuery。

标题信息可以更改(虽然我事先知道所有列),所以只删除标题是不够的,不知何故我需要读取第一行并将列信息附加到剩余行。

怎么可能?

我首先想到我必须像这篇帖子那样实现自定义来源 Reading CSV header with Dataflow
但是使用这个解决方案,我不确定如何首先解压缩Gzip。我可以以某种方式使用withCompressionType TextIO吗? (我找到了一个参数compression_type in a python Class,但我使用的是Java,但在Java FileBasedSource类中找不到类似的参数。)

此外,我觉得这有点过分,因为它使文件不可分割(虽然在我的情况下它没关系)。

或者我可以使用GoogleCloudStorage并直接在我的main()函数中读取文件及其第一行,然后进入管道。

但它也很麻烦,所以我想确认在使用Dataflow中的标头时是否有任何最佳实践(数据流方式)来读取csv文件?

1 个答案:

答案 0 :(得分:1)

如果我理解你想要正确完成什么,那么SideInput(docexample)可能就是答案。它将允许标题可以在文件的每一行旁边进行处理。

一般的想法是将标题作为单独的PCollectionView发出,并将其用作每行处理的SideInput。您可以使用SideOutput(doc

对文件进行一次传递来实现此目的

如果我正确地阅读您的问题,听起来您的标题内容因文件不同而异。如果是这样,您可以使用View.asMap保留每个文件的标题映射。遗憾的是,当前不支持跟踪当前正在读取的文件名,但this post中讨论了工作循环。