使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询
Posted
技术标签:
【中文标题】使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询【英文标题】:slow update query with redshift from python 3 using psycopg2 【发布时间】:2018-11-27 21:19:31 【问题描述】:我正在使用此代码更新 Redshift 上的几条记录(每次运行大约 30.000 条记录)。
cur = conn.cursor(cursor_factory=RealDictCursor)
sql_string_update = """UPDATE my_table SET "outlier_reason" = 0 WHERE "id" = 1;"""
for id, row in df_ignored.iterrows():
sql_ = sql_string_update.format(row['outlier_reason'],id)
cur.execute(sql_)
conn.commit()
每次运行大约 30.000 个元素最多需要 2 小时的执行时间。
有没有办法加快这个查询?
【问题讨论】:
您正在数据库上运行 30.000 次更新,这不可能变得更快。我的建议是创建一个逻辑 1. 在 S3 中为insert
新行创建一个文件 2. delete
需要更新的行。 3.使用copy
将数据从S3加载到Redshift。如果您需要更多说明,请告诉我
【参考方案1】:
在想,与其碰表并一一进行更新,不如使用ETL的做事方式,我相信这样会快很多。应该在几分钟内处理 30K 条记录。这是方法。
-
创建一个临时表,比如
stg_my_table (id,outlier_reason)
。
将您的 Python 程序数据写入 CSV 文件或 JSON 文件,无论您的情况如何。将其保存到S3
或EC2
。
使用copy
command连同ID一起加载到stg_my_table中。
通过使用 ID 与 stg_my_table
连接并设置 outlier_reason
来更新到 my_table
。
我认为上述解决方案必须将处理时间从 2 小时缩短到几分钟。 请在编写实际代码之前尝试这种方式可能是手动的。我相信您会看到非常有希望的结果,然后逐一优化上述每个步骤,甚至获得更高的性能。
【讨论】:
感谢您的回答。听起来工作量很大。我试试看,可惜没有更简单的解决方案。 @otmezger Redshift 不是为非常频繁的更新而设计的,当然也不是作为其列式数据库的单个记录更新。以上是关于使用 psycopg2 从 python 3 使用 redshift 进行慢速更新查询的主要内容,如果未能解决你的问题,请参考以下文章
psycopg2/python 将数据从 postgresql 复制到 Amazon RedShift(postgresql)
使用 Amazon Redshift 从 Python psycopg2 中的游标获取大于 MAX INT 的行数
安装 psycopg2 osx 10.12 python 3.5.2 - psycopg2 的构建轮失败