2

我在 Cloud Storage 实例 (bd_storage) 上有一个 CSV 文件,需要导入到 Cloud SQL 数据库 (test) 中已创建的表 (matriculas)。问题是 UI 导入选项默认使用由逗号 (',') 分隔的字段,而我的 CSV 文件是分号分隔 (';')。

我知道我可以使用文本编辑器将所有逗号更改为分号,但是 CSV 文件对于我的 PC 来说太大了(这就是我使用 Google Cloud Platform 的原因)。我如何使用 Cloud Shell 来做到这一点?

以下是我尝试但没有成功的一些示例:

注意:我使用登录gcloud sql connect mschiaff --user=root,然后use test指定数据库,其中“mschiaff”是 Cloud SQL 实例。

  1. LOAD DATA LOCAL INFILE 'gs://bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' INTO TABLE `matriculas` CHARACTER SET 'utf8' FIELDS TERMINATED BY ';';
    

    错误:

    2 (HY000): 找不到文件 'gs:/bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' (Errcode: 2 "No such file or directory")

  2. LOAD DATA INFILE 'gs://bd_storage/Matrícula_Ed_Superior_2016_UPLOAD.csv' INTO TABLE `matriculas` CHARACTER SET 'utf8' FIELDS TERMINATED BY ';';
    

    错误:

    错误 1045 (28000): 用户 'root'@'%' 的访问被拒绝(使用密码:是)

这是我的论文。

4

2 回答 2

3

我有几个建议,您可以使用其中任何一个来实现这一点。

LOAD DATA LOCAL INFILE不能用于指向存储桶,因为它希望文件存储在本地。因此,您需要一份存储在您用来连接 CloudSQL 实例的机器的文件系统上的 CSV 副本。例如,假设您要从 Cloud Shell 执行此操作。

1) 将 CSV 从存储桶复制到 Cloud Shell 中的主目录:

cd ~

gsutil cp gs://YOU_BUCKET_NAME/file.csv .

1) 从 Cloud Shell 连接到 CloudSQL 实例:

gcloud sql connect CLOUDSQL_INSTANCE_NAME --user root

2)连接到正确的数据库:

use DATABASE_NAME;

3) 将 csv 导入数据库中的表并指定分号分隔符(此命令中的文件位置将在 Cloud Shell 文件系统中查找文件,因为这是您连接的位置):

LOAD DATA LOCAL INFILE '/home/USERNAME/file.csv' INTO TABLE table_name FIELDS TERMINATED BY ';';

您现在应该已经成功地将 CSV 导入到数据库表中。

或者,由于您无法打开文件以将分隔符更改为逗号而不是分号,您可以尝试将 CSV 所在的存储桶安装到 Compute Engine 实例,然后sed从实例运行命令以替换所有文件中带逗号的分号。

您可以使用 FUSE 将存储桶挂载到实例。这方面的说明在这里

安装到实例后,您可以在 CSV 上运行以下命令,将分号替换为逗号。

$ sed -ie "s/;/,/g /path/to/mount/point/file.csv

将分号替换为逗号后,您就可以通过控制台导入 CSV。

于 2018-03-31T14:12:29.213 回答
0

如果对您有意义,Amazon RDS 支持 LOAD DATA LOCAL INFILE 并添加以下连接参数(应包含在连接字符串中)

ENABLE_LOCAL_INFILE=1
于 2020-05-10T10:16:30.170 回答