无法将数据复制到 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 的复制命令时没有插入任何内容

在 aws redshift 中自动化跨区域复制表

将数据从 Amazon S3 复制到 Redshift 并避免重复行

将有效负载数据从 dynamodb 复制到 redshift

将 csv 和 json 数据从 S3 复制到 Redshift

AWS DMS Redshift 作为目标