繁体   English   中英

使用python和psycopg2将数据从S3复制到AWS Redshift

[英]Copying data from S3 to AWS redshift using python and psycopg2

我在执行copy命令以将数据从S3加载到python的Amazon Redshift时遇到问题。
我有以下复制命令:

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves'
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>'
removequotes
delimiter ',';

当我使用SQL Workbench / j执行此命令时,一切都按预期工作,但是当我尝试使用python和psycopg2执行此命令时,该命令通过了OK,但未加载任何数据且未引发任何错误。
尝试了以下两个选项(假设psycopg2连接正常,因为它可以):

cursor.execute(copy_command)  
cursor.copy_expert(copy_command, sys.stdout)

都通过且没有警告,但未加载数据

有想法吗?

谢谢

我已经成功使用了此精确设置(psycopg2 + redshift + COPY)。 之后您承诺了吗? SQL Workbench默认情况下自动提交,而psycopg2默认情况下打开事务,因此直到在连接上调用commit(),数据才可见。

完整的工作流程是:

conn = psycopg2.connect(...)
cur = conn.cursor()
cur.execute("COPY...")
conn.commit()

我不认为copy_expert()或任何cursor.copy_ *命令可与Redshift一起使用。

首先,确保事务已提交

conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute(copy_cmd_str)
conn.commit()

您还可以通过以下方式确保事务提交(确保释放资源),

with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as curs:
        curs.execute(copy_cmd_str)

当连接退出with块时,如果该块未引发任何异常,则提交事务。 在例外情况下,事务将回滚。

其次,当要加载的数据花费很长时间并且超过connect_timeout(并且无法提交)时,即使执行提交也无济于事。 因此,当显式提交无济于事时,请尝试增加超时时间。

如果您使用的是sqlalchemy,则copy命令本身不会自动提交。 这为我工作:

from sqlalchemy import create_engine
eng = create_engine(...)
command = """
copy command here
"""
conn = eng.connect()
result = conn.execution_options(autocommit=True).execute(command)
result.close()

语法应类似于DDL语句

# Create table
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM