#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" }
что приведет к аналогичной цепочке инструкций 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. Вы получили решение этой проблемы?