将 GCS 存储桶中的 .csv 文件中的数据加载到 Cloud SQL 表中:

Posted

技术标签:

【中文标题】将 GCS 存储桶中的 .csv 文件中的数据加载到 Cloud SQL 表中:【英文标题】:Loading data from .csv files in GCS bucket into a Cloud SQL table: 【发布时间】:2020-05-06 20:42:40 【问题描述】:

我正在尝试将整个表从 BigQuery 传输到 Cloud SQL。经过研究,我将表格下载为 csv 格式文件到 GCS 存储桶中。然后我创建了一个 Cloud SQL mysql 实例、一个数据库和一个与 BigQuery 表具有相同架构的表。

现在,我按照此处的说明进行操作:https://cloud.google.com/sql/docs/mysql/import-export/importing 将这些 csv 文件导入 Cloud SQL 数据库。

它适用于单个文件,但如果我尝试使用 * like gs://bucket/fileprefix_* 我收到错误:错误:(gcloud.sql.import.csv)HTTPError 403:服务帐户没有存储桶所需的权限。

我的表大约是 52GB,导出到存储桶时分片为 69 个 csv 文件。

我试过了 gsutil acl ch -u [SERVICE_ACCOUNT_ADDRESS]:W gs://[BUCKET_NAME]/

gsutil acl ch -u [SERVICE_ACCOUNT_ADDRESS]:R gs://[BUCKET_NAME]/[IMPORT_FILE_NAME]

gsutil acl ch -u [SERVICE_ACCOUNT_ADDRESS]:O gs://[BUCKET_NAME]/[IMPORT_FILE_NAME]

我还去了 IAM 并编辑了服务帐户的权限,但这没有帮助。

【问题讨论】:

服务帐号现在有什么权限?我相信你在使用通配符时需要storage.objects.list 【参考方案1】:

正如格雷厄姆在评论中提到的那样,您授予的权限可能是罪魁祸首。

他提到了 storage.objects.list,这肯定是您需要的,但我认为您可能还需要 storage.buckets.get。

我的理由是,对于单个对象访问,您根本不需要了解存储桶的任何信息...但是要获取对象的完整列表,必须通过存储桶元标记检索它,这意味着需要对存储桶本身的许可。我不确定,但如果您还没有在服务帐户上设置这两个权限,请试一试。

【讨论】:

以上是关于将 GCS 存储桶中的 .csv 文件中的数据加载到 Cloud SQL 表中:的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GCS 中的 csv 随机样本导出到 BigQuery

GCP将数据作为字符串从GCS中的CSV文件加载到BigQuery表中

自定义角色以允许下载文件并禁用 GCS 存储桶中的上传文件

如何使用 gsutil 命令列出 gcs 存储桶中的所有文件(包含所有文件夹)以匹配文件内容中的特定字符串

将CSV加载到BigQuery表中的问题

将谷歌存储桶中的所有 .csv 文件读取到一个大熊猫 df 中,然后以 .csv 格式保存到另一个桶中