Загрузка нескольких файлов из S3 в Redshift, запрос, не завершающий данные в таблицах

#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.