使用Python进行redshift mysql迁移

Posted

技术标签:

【中文标题】使用Python进行redshift mysql迁移【英文标题】:redshift mysql migration using Python 【发布时间】:2018-06-29 11:49:04 【问题描述】:

您好,我正在使用以下脚本将数据从 mysql 迁移到 redshift。

mysql_table_name = 'clabDevelopment.KPI_kpireport'
mysql_cur = mysql_conn.cursor()
mysql_cur.execute('select * from %s where Date = "2018-01-01";' % mysql_table_name  )
description = mysql_cur.description
rows = mysql_cur.fetchall()

# Insert data into Redshift
redshift_table_name = 'kpi_kpireport'
redshift_cur = redshift_conn.cursor()
insert_template = 'insert into %s (%s) values %s;'
column_names = ', '.join([x[0] for x in description])
values = ', '.join(['(' + ','.join(map(str, x)) + ')' for x in rows])

redshift_cur.execute(insert_template % (redshift_table_name, column_names, values))

我遇到的邮件问题是当值为空白时:

values (241325,2018-01-01,None,,CHG,USA,N.

在 None 和 CHG 之间有 " ,, " 会导致程序失败。

这是错误:

Traceback (most recent call last):
  File "C:\Users\trackstarz\migration.py", line 20, in <module>
    redshift_cur.execute(insert_template % (redshift_table_name, column_names, values))
psycopg2.ProgrammingError: syntax error at or near ","
LINE 1: ...re_Costs, FBA_Fee) values (241325,2018-01-01,None,,CHG,USA,N...
                                                             ^

[Finished in 2.0s]

【问题讨论】:

除非您只有几行,否则该方法将非常慢。考虑其他路线,例如 AWS DMS 【参考方案1】:

将数据加载到 Amazon Redshift 的首选方法是通过 COPY 命令。这允许在所有节点上并行加载批量数据。

建议不要使用单独的INSERT 语句来加载数据。 (如果您从另一个表中选择批量数据,INSERT 很好。)

因此,我建议您修改程序以输出 CSV 文件(或其他支持的格式),然后使用 COPY 命令加载它。这样调试也会更干净、更容易。

【讨论】:

以上是关于使用Python进行redshift mysql迁移的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python udf 中使用 select 查询进行 redshift?

使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询

在 Redshift 中使用等效的 Latin1 进行转换

如何在 python 中从 redshift 更快地处理数据?

Python 中的 Redshift 连接单元测试

无法从 lambda 中的 python 连接到 aws redshift