Невозможно скопировать данные в AWS RedShift

#python #amazon-web-services #amazon-redshift #boto3

#python #amazon-веб-сервисы #amazon-redshift #boto3

Вопрос:

Я много пробовал, однако я не могу скопировать данные, доступные в виде файла json в корзине S3 (у меня есть доступ только для чтения к корзине), в таблицу Redshift с использованием python boto3. Ниже приведен код 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. Я не вижу никаких причин, по которым это было прервано (или я не знаю, где это искать)

введите описание изображения здесь

Другая вещь, которую я заметил, это то, что когда я запускаю инструкцию copy в редакторе запросов Redshift, она работает нормально, и данные перемещаются в таблицу. Я попытался удалить и воссоздать кластер, но безуспешно. Я не могу понять, что я делаю неправильно. Спасибо

Ответ №1:

Быстрое чтение — похоже, вы не зафиксировали транзакцию, и КОПИЯ откатывается при закрытии соединения. Вам нужно либо изменить конфигурацию подключения, чтобы она была в «автоматической фиксации», либо добавить явную «фиксацию ()».