如何在 Google 云存储中分割一个大的 csv.gz 文件?

how do I split a large csv.gz file in Google Cloud Storage?

我尝试在 Google BQ 中加载 table 时出现此错误:

Input CSV files are not splittable and at least one of the files is larger than the maximum allowed size. Size is: 56659381010. Max allowed size is: 4294967296.

有没有办法使用 gsutil 或类似工具拆分文件而无需再次上传所有内容?

您可以加​​载到 BigQuery 中的最大压缩 CSV 文件是 4 gigabytes。遗憾的是,GCS 不提供解压缩压缩文件的方法,也不提供拆分压缩文件的方法。 GZip 文件不能像 tar 文件那样任意拆分和重新组合。

我想你最好的选择可能是在与你的 GCS 存储桶相同的区域启动一个 GCE 实例,将你的对象下载到该实例(这应该非常快,因为它只有几十 GB) ,解压缩对象(这会更慢),将该 CSV 文件分成一堆较小的文件(linux split 命令对此很有用),然后将对象上传回 GCS。

我 运行 遇到了同样的问题,我是这样处理的:

首先,启动一个 Google Compute Engine VM 实例。 https://console.cloud.google.com/compute/instances

然后安装 gsutil 命令,然后完成身份验证过程。 https://cloud.google.com/storage/docs/gsutil_install

验证 gcloud、gsutil 和 bq 命令正常工作后,将磁盘快照保存为 snapshot-1,然后删除此 VM。


在您的本地机器上,运行此命令创建一个新磁盘。此磁盘用于 VM,以便您有足够的 space 下载和解压缩大文件。

gcloud compute disks create disk-2017-11-30 --source-snapshot snapshot-1 --size=100GB

再次在您的本地计算机上,运行此命令创建一个使用此磁盘的新 VM 实例。我使用 --preemptible 标志来节省一些成本。

gcloud compute instances create loader-2017-11-30 --disk name=disk-2017-11-30,boot=yes --preemptible

现在您可以通过 SSH 连接到您的实例,然后 运行 在 远程机器上执行这些命令

首先,将文件从云存储复制到虚拟机

gsutil cp gs://my-bucket/2017/11/20171130.gz .

然后解压文件。就我而言,对于 ~4GB 文件,完成此步骤大约需要 17 分钟:

gunzip 20171130.gz

解压缩后,您可以 运行 bq load 命令将其加载到 BigQuery 中,但我发现对于我的文件大小(解压缩后约 70 GB),该操作大约需要 4 个小时。相反,我将解压缩的文件上传回 Cloud Storage

gsutil cp 20171130 gs://am-alphahat-regional/unzipped/20171130.csv

现在文件已返回云存储,您可以运行此命令删除虚拟机。

gcloud compute instances delete loader-2017-11-30

理论上关联的磁盘应该也被删除了,但我发现磁盘还在,我需要通过额外的命令删除它

gcloud compute disks delete disk-2017-11-30

现在终于可以运行 bq 加载命令或者从控制台加载数据了。