每次运行COPY命令时都应该创建表

时间:2018-06-12 13:43:28

标签: python mysql postgresql amazon-web-services amazon-redshift

我的任务是将MySQL数据库移动到amazon redshift。目前我试图通过

来实现这一目标

1)将表格转换为CSV文件

2)将它们存储在S3

3)在redshift中创建一个表

4)使用COPY命令将数据从S3传输到redshift

我正在使用Python尝试自动执行此过程,并使用boto3加密到S3的数据。

但是,通过我现在的流程,我必须在Redshift中为S3中的每个csv手动创建一个表。由于我最终会移动大量数据,因此效率非常低。

我是否可以运行代码来检测架构并创建表,而无需每次我想加载新数据时都进入并更改CREATE TABLE语句?

1 个答案:

答案 0 :(得分:0)

显然,下面的答案只是提供工作步骤,如果正确遵循将完成您尝试自动化的工作。在我的案例中我做了类似的事情,虽然用例并不像你想要的那样精确。

  1. Expore所有表名。
  2. 循环表名。
  3. 每张桌子重复4到8个。
  4. 从MySQL导出表格架构
  5. 在Redshift中创建表格
  6. 从MySQL导出TSV中的数据
  7. 将TSV文件输入S3
  8. 将数据复制到Redshift
  9. 就是这样。

    mysql -h localhost -u user -pPassword test --skip-column-names --execute="SHOW TABLES;" > database.tmp
    echo "Start!"
    /* Look over table name names */
    
    for /F %%A in (database.tmp) do (
       echo "Exporting table Names for %%A"
       mysqldump -h localhost -u radhe -pPassword --no-data  database %%A > "%%A_tables.sql"
    
       psql -h redshift-hostname -d databasename -U username -f "%%A_tables.sql"
    
       mysql -h localhost -u user -pPassword  -e "select * from %%A" -B > %%A_data.tsv
    
       S3CMD put s3://yourbucket:path/%%A_data.tsv %%A_data.tsv
    
       psql -h redshift-hostname -d databasename -U username -c "copy %%A from 's3://yourbucket:path/%%A_data.tsv' 
    iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';"
    
    )
    

    PS :以上for循环适用于Windows,但您可以将其更改为Linux/Unix