从GCS到BQ获取大量的csv文件

时间:2019-01-08 20:56:40

标签: python csv google-bigquery google-cloud-storage google-cloud-dataflow

我有一个非常大的CSV文件(例如1TB),我需要将其从GCS传输到BQ。虽然BQ确实有CSV加载程序,但是我拥有的CSV文件是非标准的文件,如果不进行格式化就无法最终正确加载到BQ。

通常,我会将csv文件下载到服务器上以对其进行“处理”,然后将其直接保存到BQ或BQ可以轻松摄取的avro文件中。但是,文件很大,很可能(可能)没有编写大量代码对其进行优化/流处理的存储/内存就无法进行批处理。

这是使用Cloud Dataflow的好用例吗?是否有任何教程可以将GCS格式的“ X”文件导入BQ?任何这样做的教程指针或示例脚本都很棒。

3 个答案:

答案 0 :(得分:2)

我会考虑使用Cloud Dataprep

Dataprep可以从GCS导入数据,清理/修改数据并导出到BigQuery。我喜欢的功能之一是,所有操作都可以可视/交互方式进行,以便我可以看到数据如何转换。

从数据的子集开始,了解需要进行哪些转换,并在加载和处理TB数据之前进行一些练习。

答案 1 :(得分:2)

我个人将使用Dataflow(而不是Dataprep)并编写一个简单的管道来并行读取文件,清理/转换文件,最后将其写入BigQuery。这很简单。 Here's是我的GitHub存储库中的一个示例。尽管它是Java语言,但您可以轻松地将其移植到Python。注意:它使用Dataflow中的“模板”功能,但是可以用一行代码来更改。

如果数据流不在桌面上,则另一个选择可能是使用一个奇怪的/未使用的定界符,并将整行读入BigQuery。然后使用SQL / Regex / UDF对其进行清理/转换/解析。参见here(来自Felipe的建议)。过去,我们已经做过很多次了,并且因为您在BigQuery中,它的伸缩性非常好。

答案 2 :(得分:0)

您始终可以从存储桶直接转移到BQ表中:

bq --location=US load --[no]replace --source_format=CSV dataset.table gs://bucket/file.csv [schema]

在这里,[schema]可以是csv文件的内联架构(如id:int,name:string,..)或JSON架构文件的路径(本地可用)。

根据BQ文档,他们尝试将大型CSV负载并行化到表中。当然,这涉及到上限:要从GCS加载到BQ的未压缩(csv)文件的最大大小应小于等于5TB,这超出了您的要求。我认为您应该对此感到满意。