我的任务是将MySQL数据库移至Amazon redshift。目前,我正试图通过
1)将表格转换为CSV文件
2)将它们存储在S3中
3)在redshift中创建表
4)使用COPY命令将数据从S3传输到redshift
我正在使用Python尝试自动执行此过程,并使用boto3对通往S3的数据进行加密。
但是,通过现在的过程,我将不得不在Redshift中为S3中的每个csv手动创建一个表。由于我最终将要移动大量数据,因此效率将非常低下。
我是否可以运行代码来检测架构和创建表,而不必每次输入新数据时都需要进入并更改CREATE TABLE语句?
最佳答案
显然,下面的答案仅提供了工作步骤,如果正确地遵循这些步骤,将可以完成您尝试实现的自动化工作。在我的情况下,我做了类似的事情,尽管用例并不精确,因为您要在此处尝试做。
显示所有表名。
遍历表名。
对每个表重复4到8。
从MySQL导出表架构
在Redshift中创建表
从MySQL导出TSV中的数据
将TSV文件放入S3
将数据复制到Redshift
就这样。
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
关于python - 每次运行COPY命令时都应该创建表吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50818766/