Сбой задания склеивания AWS Pyspark в glueContext.write_dynamic_frame.from_jdbc_conf

#pyspark #amazon-redshift #aws-glue

#pyspark #amazon-redshift #aws-glue

Вопрос:

Работая с заданием в AWS Glue для выполнения перехода с S3 на Redshift, я столкнулся с этой ошибкой:

 exception: java.sql.SQLException: [Amazon](500310) Invalid operation: relation "public.#table_stg" does not exist
 

Я использую действия pre и post в своих параметрах подключения, чтобы я мог создать временную таблицу в качестве промежуточного этапа. Мой код выглядит так:

 table_wo_schema = "my_table"
stg_table_name = f"#{table_wo_schema}_stg"
table_name = f"myschema.{table_wo_schema}"

pre_query = f"drop table if exists {stg_table_name};create table {stg_table_name} as select * from {table_name} where 1=2;"
post_query= f"delete from {table_name} using {stg_table_name} where {stg_table_name}.id = {table_name}.id ; insert into {table_name} select * from {stg_table_name}; drop table {stg_table_name};"

#Job fails here
glueContext.write_dynamic_frame.from_jdbc_conf(
    frame = dynamic_frame_to_write, 
    catalog_connection = "my-redshift-connection", 
    connection_options = {
        "preactions":pre_query,
        "dbtable": stg_table_name, 
        "database": "my-redshift-database",
        "postactions":post_query
        },
    redshift_tmp_dir = "s3://some/dir"
    )
 

Я взял идею отсюда:

https://aws.amazon.com/es/premiumsupport/knowledge-center/sql-commands-redshift-glue-job/

я обнаружил, что за кулисами объект glueContext добавляет «общедоступную» схему, когда в:

 conection_options = { "dbtable" : "#my_table_stg" }
 

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-jdbc

что приведет к аналогичной цепочке инструкций SQL:

 --pre action statements
statement1;
statement2;
...
--write dynamic frame to Redshift
COPY public.#my_table_stg (column1, column2, ...) FROM 's3://some/path/manifest.json' CREDENTIALS '' FORMAT AS CSV NULL AS '@NULL@' manifest;
--post action statements
...
statement N;
 

Насколько я знаю, временные таблицы могут находиться в другой схеме, зависящей от первого элемента search_path . Несмотря на это, невозможно ссылаться на временную таблицу, которой предшествует какая-либо схема

 --Invalid Redshift statement
select * from someschema.#temp_table

--Valid statement
select * from #temp_table
 

Я не знаю, какой конфигурации мне не хватает для выполнения задания upsert с использованием временных таблиц.

Чтобы было понятно, я знаю, что мог бы обойти это, используя обычные таблицы вместо временных, но мне не нравится идея иметь промежуточные таблицы, доступные из других сеансов. Я заранее признателен за любую помощь

Комментарии:

1. Вы получили решение этой проблемы?