#python #amazon-s3 #amazon-redshift
#python #amazon-s3 #amazon-redshift
Вопрос:
У меня есть скрипт, запускаемый из lambda, который выполняет следующий запрос:
COPY test.error_log__c
FROM 's3://sfdc-etl-jp-test/sfdc_etl/json/error_log__c_json/2019/03/23/'
iam_role 'arn:aws:iam::<account>:role/LambdaFullAccessRole'
TRUNCATECOLUMNS
JSON 'auto'
Однако таблицы пусты, даже несмотря на успешное завершение запроса. В этих путях находится от 1 до 100 файлов. Я предполагаю, что команда копирования недостаточно умна, чтобы знать, каково имя файла, и именно поэтому это не работает. Я прав? если да, то как мне указать ему загружать несколько файлов?
Вот код, который выполняется на случай, если это не проблема с запросом:
create_engine('postgres://{}:{}@{}/ibdrs'.format(igersUser, igersPwd, igersHost), encoding="utf-8")
loadQuery = '''
COPY {}.{}
FROM '{}{}/{}'
iam_role 'arn:aws:iam::<account>:role/LambdaFullAccessRole'
TRUNCATECOLUMNS
JSON 'auto'
EMPTYASNULL
TIMEFORMAT 'auto'
DATEFORMAT 'auto'
COMPUPDATE OFF
STATUPDATE ON
'''.format(igersSchema, nextObj, s3Destination, s3Path.format(nextObj), dated_path)
with igers.connect() as conn:
try :
conn.execute(drop_table)
print('completed drop table')
conn.execute(ddl_str)
print('completed create table')
conn.execute(loadQuery).execution_options(autocommit=True)
print('completed load query')
for row in range(len(groupPerms)) :
perms_statement = grantPerms.format(groupPerms['namespace'].iloc[row],groupPerms['item'].iloc[row],groupPerms['groname'].iloc[row])
conn.execute(perms_statement)
print('completed grant group permissions')
conn.close()
except exc.SQLAlchemyError as e :
print(e)
Примечание: Да, я знаю, что есть другие запросы, они не отображаются во время выполнения. Удаление таблицы, воссоздание таблицы, повторное применение разрешений — все работает и подтверждено работоспособностью. Это просто копия из S3, которая ничего не делает.
Комментарии:
1. выполнение этого непосредственно в redshift через navicat приводит к добавлению 132 записей. почему это не сработало бы через EC2 / Lambda в скрипте с этой ролью, связанной с ними
2. Я просмотрел журналы Redshift, и, похоже, нет разницы между запросами, которые Redshift видит при ручном выполнении через navicat, и скриптовым выполнением через lambda. На что еще мне следует обратить внимание?
Ответ №1:
Ответ таков …. по-видимому, порядок имеет значение для sqlalchemy:
create_engine('postgres://{}:{}@{}/ibdrs'.format(igersUser, igersPwd, igersHost), encoding="utf-8")
loadQuery = '''
COPY {}.{}
FROM '{}{}/{}'
iam_role 'arn:aws:iam::<account>:role/LambdaFullAccessRole'
TRUNCATECOLUMNS
JSON 'auto'
EMPTYASNULL
TIMEFORMAT 'auto'
DATEFORMAT 'auto'
COMPUPDATE OFF
STATUPDATE ON
'''.format(igersSchema, nextObj, s3Destination, s3Path.format(nextObj), dated_path)
with igers.connect() as conn:
try :
conn.execute(drop_table)
print('completed drop table')
conn.execute(ddl_str)
print('completed create table')
conn.execution_options(autocommit=True).execute(loadQuery)
print('completed load query')
for row in range(len(groupPerms)) :
perms_statement = grantPerms.format(groupPerms['namespace'].iloc[row],groupPerms['item'].iloc[row],groupPerms['groname'].iloc[row])
conn.execute(perms_statement)
print('completed grant group permissions')
conn.close()
except exc.SQLAlchemyError as e :
print(e)
вы заметите изменение порядка на auto_commit.