我在谷歌云存储中有大量json文件,我想加载到Bigquery中。未压缩的平均文件大小为5MB。问题是它们不是换行的,所以我不能按原样加载到bigquery。我最好的方法是什么?我应该使用谷歌功能或数据准备,还是只是启动服务器,让它下载文件,重新格式化并上传回云存储,然后再上传到Bigquery?
在加载到Bigquery之前不要压缩数据。另一个项目,5 MB对于Bigquery来说很小。我会考虑整合策略,也许在处理每个Json文件时更改文件格式。
您可以使用Dataprep、Dataflow甚至Dataproc。根据文件的数量,这可能是最佳选择。任何大于100000个5MB文件的文件都需要一个具有许多节点的大型系统。
对于超过几千个文件的内容,云函数将花费太长时间。
另一种选择是编写一个简单的Python程序,对云存储上的文件进行预处理,并将其直接加载到BigQuery中。除非添加合并,否则我们只讨论20或30行代码。一个5 MB的文件大约需要500毫秒才能加载、处理和写回。我不确定Bigquery的加载时间。对于50000个5 MB的文件,在大型计算引擎实例上的一个线程需要12到24小时(您需要高网络带宽(。
另一种选择是启动多个计算引擎。一个引擎会将每条消息的N个文件(大约4或16个(的名称放入Pub/Sub中。然后,多个Compute实例订阅同一主题并并行处理文件。同样,这只是另外100行代码。
如果你的项目由数百万个文件组成,那么网络带宽和计算时间将是一个问题,除非时间不是一个因素。
您可以使用Dataflow来完成此操作。
选择"云存储上的文本文件到BigQuery"模板:
可以读取存储在GCS中的文本文件并执行转换的管道通过用户定义的javascript函数,并将结果加载到BigQuery。此管道需要一个javascript函数和一个JSON描述产生的BigQuery模式。
您需要在Javascript中添加一个UDF,在创建作业时将其从JSON转换为换行的JSON。
这将从GCS检索文件,将其转换并自动上传到BigQuery。