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

Python 从GCS到BQ获取大量csv文件,python,csv,google-bigquery,google-cloud-storage,google-cloud-dataflow,Python,Csv,Google Bigquery,Google Cloud Storage,Google Cloud Dataflow,我有一个非常大的CSV文件,比如说1TB,我需要从GCS到BQ。虽然BQ有一个CSV加载器,但我的CSV文件是非常非标准的,如果不格式化它,就不能正确加载到BQ 通常情况下,我会将csv文件下载到服务器上进行“处理”,并将其直接保存到BQ或avro文件中,以便BQ轻松接收。但是,这些文件非常大,而且很可能,如果不编写大量代码来优化/流式处理,我就没有足够的存储/内存来进行批处理 这是使用云数据流的好用例吗?有没有什么教程可以帮助你将格式为X的文件从GCS导入BQ?任何教程指针或示例脚本都会很棒。

我有一个非常大的CSV文件,比如说1TB,我需要从GCS到BQ。虽然BQ有一个CSV加载器,但我的CSV文件是非常非标准的,如果不格式化它,就不能正确加载到BQ

通常情况下,我会将csv文件下载到服务器上进行“处理”,并将其直接保存到BQ或avro文件中,以便BQ轻松接收。但是,这些文件非常大,而且很可能,如果不编写大量代码来优化/流式处理,我就没有足够的存储/内存来进行批处理

这是使用云数据流的好用例吗?有没有什么教程可以帮助你将格式为X的文件从GCS导入BQ?任何教程指针或示例脚本都会很棒。

我会考虑使用. Dataprep可以从GCS导入数据,清理/修改数据并导出到BigQuery。我喜欢的一个特性是,一切都可以可视化/交互地完成,这样我就可以看到数据是如何转换的

从数据的子集开始,看看需要哪些转换,并在加载和处理数据TB之前给自己一些实践。

< P>我会考虑使用. Dataprep可以从GCS导入数据,清理/修改数据并导出到BigQuery。我喜欢的一个特性是,一切都可以可视化/交互地完成,这样我就可以看到数据是如何转换的


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

您始终可以直接从存储桶传输到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文件的最大大小应您始终可以从存储桶直接传输到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文件的最大大小应该是我个人会使用Dataflow而不是Dataprep,并编写一个简单的管道来并行读取文件,清理/转换它,最后将其写入BigQuery。这很简单。我的GitHub repo中的一个示例。尽管它是用Java编写的,但您可以轻松地将其移植到Python。注意:它在数据流中使用了模板功能,但这可以通过一行代码来更改


如果数据流不在表中,另一个选项可能是使用奇怪/未使用的分隔符,并将整行读取到BigQuery中。然后使用SQL/Regex/UDFs来清理/转换/解析它。参见Felipe的建议。我们在过去已经做过很多次了,因为您使用的是BigQuery,所以它的伸缩性非常好。

我个人会使用Dataflow而不是Dataprep,编写一个简单的管道来并行读取文件,清理/转换文件,最后将其写入BigQuery。这很简单。我的GitHub repo中的一个示例。尽管它是用Java编写的,但您可以轻松地将其移植到Python。注意:它在数据流中使用了模板功能,但这可以通过一行代码来更改


如果数据流不在表中,另一个选项可能是使用奇怪/未使用的分隔符,并将整行读取到BigQuery中。然后使用SQL/Regex/UDFs来清理/转换/解析它。参见Felipe的建议。我们在过去已经做过很多次了,因为您使用的是BigQuery,所以它的伸缩性非常好。

Dataflow可以用Python或Java实现这一点,Dataprep也可以为您实现这一点。@Pablo是否有任何示例链接可以显示如何使用Dataflow实现类似的操作?Dataflow可以用Python或Java实现这一点,Dataprep也可以为您做这件事。@Pablo是否有任何示例链接可以显示如何使用Dataflow完成类似的事情?谢谢您的建议。使用Dataflow和Dataprep之间有什么区别?云数据流是否适用于上述任务,或者云数据流是否不是一个选项?数据流使用的软件通常是Python,而Dataprep使用的是可视化仪表板。两者都可以做你想做的事情,只是技术不同。我试过几次使用Dataprep的界面,每次导入文件都会遇到限制。例如,json文件必须是json换行符等。每次使用它时,我实际上无法完成我需要的内容,因此我认为Dataflow可能更适合此任务。一个奇怪的事实是Dataprep生成数据流管道并运行它们。Dataprep作为一种可视化工具比编写
SDK本身的数据流管道。@Pablo-同意。不是每个人都能编写甚至想编写Python或Java程序。一些分析师希望使用可视化或拖放式工具,而不需要开发人员为其编写程序。我是一名开发人员,我尝试使用正确的工具来完成这项工作。有时这是Dataprep,有时是Dataflow,有时是Dataproc,有时是在GCE上运行的简单Python脚本,在直接导入到BQ之前从GCS读取并回写GCS。感谢您的建议。使用Dataflow和Dataprep之间有什么区别?云数据流是否适用于上述任务,或者云数据流是否不是一个选项?数据流使用的软件通常是Python,而Dataprep使用的是可视化仪表板。两者都可以做你想做的事情,只是技术不同。我试过几次使用Dataprep的界面,每次导入文件都会遇到限制。例如,json文件必须是json换行符等。每次使用它时,我实际上无法完成我需要的内容,因此我认为Dataflow可能更适合此任务。一个奇怪的事实是Dataprep生成数据流管道并运行它们。Dataprep作为一种可视化工具,比用SDK本身编写数据流管道更为有限。@Pablo-同意。不是每个人都能编写甚至想编写Python或Java程序。一些分析师希望使用可视化或拖放式工具,而不需要开发人员为其编写程序。我是一名开发人员,我尝试使用正确的工具来完成这项工作。有时这是Dataprep,有时是Dataflow,有时是Dataproc,有时是在GCE上运行的简单Python脚本,在直接导入BQ之前从GCS读写GCS。理论上,这很有效。然而,在实践中,这些文件通常不是BQ就绪的。例如,文件中的字段分隔符可能是非标准分隔符,如\x01,可能不在第一行开始,可能有注释字符等。鉴于此要求,您建议如何执行此操作?从这里的链接中--我们将遇到它们的四个限制中的四个,我们的csv编码分隔符部分也不适用于BQ。换句话说,我们需要对文件进行“预处理”。从理论上讲,这很有效。然而,在实践中,这些文件通常不是BQ就绪的。例如,文件中的字段分隔符可能是非标准分隔符,如\x01,可能不在第一行开始,可能有注释字符等。鉴于此要求,您建议如何执行此操作?从这里的链接中--我们将遇到它们的四个限制中的四个,我们的csv编码分隔符部分也不适用于BQ。换句话说,我们需要“预处理”文件。在上面使用一个奇怪的分隔符是一种非常有趣的方法。我有时在pandas中使用它来将所有数据放在一列中。但是,我们在使用这种方法时遇到的一件事是,行有时没有分隔符。我见过\x02这样的字段终止符,因此单个记录将跨越两行或更多行。有没有一种可能的方法可以用BQ方法解决这个问题?在上面使用一个奇怪的分隔符是非常有趣的方法。我有时在pandas中使用它来将所有数据放在一列中。但是,我们在使用这种方法时遇到的一件事是,行有时没有分隔符。我见过\x02这样的字段终止符,因此单个记录将跨越两行或更多行。有没有一种可能的方法可以用BQ方法解决这个问题?