无法将数据复制到 AWS RedShift
Posted
技术标签:
【中文标题】无法将数据复制到 AWS RedShift【英文标题】:Unable to copy data into AWS RedShift 【发布时间】:2020-12-29 04:07:40 【问题描述】:我尝试了很多,但是我无法使用 python boto3 将 S3 存储桶中的 json 文件(我对存储桶具有只读访问权限)复制到 Redshift 表中。下面是我用来复制数据的python代码。使用相同的代码,我能够创建要复制的表。
import configparser
import psycopg2
from sql_queries import create_table_queries, drop_table_queries
def drop_tables(cur, conn):
for query in drop_table_queries:
cur.execute(query)
conn.commit()
def create_tables(cur, conn):
for query in create_table_queries:
cur.execute(query)
conn.commit()
def main():
try:
config = configparser.ConfigParser()
config.read('dwh.cfg')
# conn = psycopg2.connect("host= dbname= user= password= port=".format(*config['CLUSTER'].values()))
conn = psycopg2.connect(
host=config.get('CLUSTER', 'HOST'),
database=config.get('CLUSTER', 'DB_NAME'),
user=config.get('CLUSTER', 'DB_USER'),
password=config.get('CLUSTER', 'DB_PASSWORD'),
port=config.get('CLUSTER', 'DB_PORT')
)
cur = conn.cursor()
#drop_tables(cur, conn)
#create_tables(cur, conn)
qry = """copy DWH_STAGE_SONGS_TBL
from 's3://udacity-dend/song-data/A/A/A/TRAAACN128F9355673.json'
iam_role 'arn:aws:iam::xxxxxxx:role/MyRedShiftRole'
format as json 'auto';"""
print(qry)
cur.execute(qry)
# execute a statement
# print('PostgreSQL database version:')
# cur.execute('SELECT version()')
#
# # display the PostgreSQL database server version
# db_version = cur.fetchone()
# print(db_version)
print("Executed successfully")
cur.close()
conn.close()
# close the communication with the PostgreSQL
except Exception as error:
print("Error while processing")
print(error)
if __name__ == "__main__":
main()
我在 Pycharm 控制台中没有看到任何错误,但我在 redshift 查询控制台中看到了 Aborted 状态。我看不出它被中止的任何原因(或者我不知道在哪里寻找)
我注意到的另一件事是,当我在 Redshift 查询编辑器中运行复制语句时,它运行良好并且数据被移动到表中。我试图删除并重新创建集群,但没有运气。我无法弄清楚我做错了什么。谢谢
【问题讨论】:
【参考方案1】:快速阅读 - 看起来您还没有提交事务,并且当连接关闭时 COPY 会回滚。您需要将连接配置更改为“自动提交”或添加显式“commit()”。
【讨论】:
以上是关于无法将数据复制到 AWS RedShift的主要内容,如果未能解决你的问题,请参考以下文章
AWS:使用从 s3 到 redshift 的复制命令时没有插入任何内容
将数据从 Amazon S3 复制到 Redshift 并避免重复行
将有效负载数据从 dynamodb 复制到 redshift