使用Cloud Shell从Cloud Storage导入CSV到Cloud SQL

时间:2018-03-31 02:49:12

标签: csv google-cloud-platform google-cloud-storage google-cloud-sql google-cloud-shell

我在云存储实例(bd_storage)上有一个CSV文件,需要导入云SQL数据库中已创建的表(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“没有这样的文件或目录”)

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

    错误:

      

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

  3. 这是我的论文。

2 个答案:

答案 0 :(得分:2)

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

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导入数据库表。

或者,关于您无法打开文件以将分隔符更改为逗号而不是分号,您可以尝试将CS​​V所在的存储桶装入计算引擎实例,然后运行sed来自实例的命令用文件中的逗号替换所有分号。

您可以使用FUSE将存储桶挂载到实例。相关说明为here

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

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

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

答案 1 :(得分:0)

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

ENABLE_LOCAL_INFILE=1