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