Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow 谷歌云数据流(ApacheBeam)-如何处理带有头的gzip csv文件?_Google Cloud Dataflow_Apache Beam - Fatal编程技术网

Google cloud dataflow 谷歌云数据流(ApacheBeam)-如何处理带有头的gzip csv文件?

Google cloud dataflow 谷歌云数据流(ApacheBeam)-如何处理带有头的gzip csv文件?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我在GCS中有csv gzip压缩文件。我想读取这些文件并将数据发送到BigQuery 标题信息可以更改,尽管我事先知道所有列,所以仅仅删除标题是不够的,我需要读取第一行并将列信息附加到其余行 怎么可能呢 首先,我认为我必须实现一个像本文这样的自定义源代码。 但是有了这个解决方案,我不确定如何首先解压缩Gzip。我能不能像TextIO一样使用compressionType? 我找到了一个参数压缩类型,但我使用的是Java,在Java FileBasedSource类中找不到类似的类型 我也觉得这

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

标题信息可以更改,尽管我事先知道所有列,所以仅仅删除标题是不够的,我需要读取第一行并将列信息附加到其余行

怎么可能呢

首先,我认为我必须实现一个像本文这样的自定义源代码。 但是有了这个解决方案,我不确定如何首先解压缩Gzip。我能不能像TextIO一样使用compressionType? 我找到了一个参数压缩类型,但我使用的是Java,在Java FileBasedSource类中找不到类似的类型

我也觉得这有点过分,因为它使一个文件无法丢弃,虽然在我的情况下,它是好的

或者我可以使用GoogleCloudStorage直接读取一个文件及其主函数中的第一行,然后进入管道


但这也很麻烦,所以我想确认一下,在使用数据流中的头文件时,是否有任何最佳做法,即使用数据流方式读取csv文件?

如果我理解您试图正确完成的任务,SideInput可能就是这里的答案。它将允许标题可用于处理文件的每一行

一般的想法是将标题作为单独的PCollectionView发出,并将其用作每行处理的侧输入。您可以通过使用SideOutput对文件进行单次传递来实现这一点


如果我读对了你的问题,听起来你的标题内容在不同的文件中有所不同。如果是这样,您可以使用View.asMap保存每个文件的标题映射。不幸的是,本机目前不支持跟踪正在读取的当前文件名,但中讨论了一些相关工作。

对您来说,对某些TextIO转换进行子类化并添加特殊行为应该相当容易。@Pablo是否有任何示例可供我参考以扩展TextIO并添加特殊行为?我想我需要使用Source来扩展文件处理的行为,我知道怎么做,但是这样做我就失去了自动解压缩TextIO的gz文件的好处。谢谢你的回复。看起来我可以1首先创建一个仅提取标题行的PCollection 2使用Combine.globally和View.asSingleton 3将其转换为PCollection视图创建另一个PCollection,该PCollection从csv中提取所有剩余行的实际数据,并在2中获得标题信息的侧面输入。如果我错了,请纠正我。正如您所理解的,每个文件的头实际上是不同的,但是现在我决定每个文件提交一个作业,在我们的情况下,这是可以接受的。我可以读取头并通过上面的方法使用它。谢谢: