Задание AWS Glue Spark не поддерживает имя столбца в верхнем регистре с двойными кавычками

Постановка проблемы / основная причина: мы используем AWS Glue для загрузки данных из производственной базы данных PostGress в AWS DataLake. Glue внутренне использует задание Spark для перемещения данных. Однако наш процесс ETL не работает, поскольку Spark поддерживает только строчные имена столбцов таблицы и, к сожалению, все имена столбцов исходной таблицы PostGress находятся в CamelCase и заключены в двойные кавычки.

Например. : Имя столбца нашей исходной таблицы в базе данных PostGress - «CreatedDate». Запрос задания Spark ищет createddate и завершается ошибкой, потому что не может найти имя столбца. Таким образом, запрос искрового задания должен искать именно CreatedDate, чтобы иметь возможность перемещать данные из базы данных PostGress. Это кажется внутренним ограничением как Spark (поскольку он поддерживает только строчные имена столбцов таблицы), так и PostGress (имена столбцов, которые были созданы с помощью двойных кавычек, должны заключаться в двойные кавычки до конца своей жизни).

Справочные ссылки: https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html Чувствительны ли имена столбцов PostgreSQL к регистру?

Оцененные решения: 1. Мы не сможем переименовать имена столбцов из CamelCase в нижний регистр, так как это потребует больших изменений во всех последующих системах. 2. Мы пытаемся переписать / настроить автоматически сгенерированный Glue код Spark, чтобы увидеть, сможем ли мы заставить его работать с именами столбцов исходной таблицы, заключенными в двойные кавычки и не в нижнем регистре.

Кто-нибудь сталкивался с этой проблемой раньше, и вы пытались настроить автоматически сгенерированный код Spark, чтобы он работал?


person rajmohan k    schedule 25.09.2019    source источник


Ответы (2)


Решение 1. Если вы используете scala и склеиваете динамический фрейм, вы можете использовать applyMapping(). Значение по умолчанию для caseSensitive - истина. Отметьте https://docs.aws.amazon.com/glue/latest/dg/glue-etl-scala-apis-glue-dynamicframe-class.html#glue-etl-scala-apis-glue-dynamicframe-class-defs-applyMapping

Решение 2.Если вы используете фрейм данных pyspark в Python, вы можете установить conf:

spark_session.sql('set spark.sql.caseSensitive=true')
person Sandeep Fatangare    schedule 25.09.2019
comment
Я смотрю в твой код. Проблема ни в искре, ни в клее. Это Афина. Проблема в строке: self.source_schema = self.glue_client.get_table()['Table']['StorageDescriptor']['Columns'] Вы пытаетесь получить схему из таблицы athana, и в столбцах athena всегда будет нижний регистр. Проверьте docs.aws.amazon.com/athena / latest / ug / Moreever, athena не может иметь никаких специальных символов, кроме _ (подчеркивание). Возможно, вам придется найти другое место для получения сведений о столбце, а не таблицу athena, или вам придется сопоставить исходные столбцы с столбцами dest в applyMapping (). - person Sandeep Fatangare; 26.09.2019

Сандип Фатангаре благодарит вас за предложение.

Я новичок в AWS Glue и не знаю, правильно ли я поступаю. Пожалуйста, помогите мне, если я ошибаюсь.

Я пытаюсь отредактировать сценарий, перейдя в

AWS Glue - ›Вакансии и выберите сценарий невыполненной работы.

На вкладке сведений показано расположение местоположения, указанное в сведениях о задании: s3: //aws-glue-assets-us-east-1/scripts/glueetl/jdbc_incremental.py.

И во вкладке Скрипт я начинаю редактировать скрипт

предыдущий :

applymapping1 = ApplyMapping.apply(frame=datasource0, mappings=self.get_mappings(),                                                                                      transformation_ctx="applymapping1_" + self.source.table_name)

Отредактировано:

applymapping1 = ApplyMapping.apply(frame=datasource0, mappings=self.get_mappings(),
                                           caseSensitive : Boolean = false, 
                                           transformation_ctx="applymapping1_" + self.source.table_name)

И я столкнулся с 2 проблемами

  1. Не могу сохранить отредактированный скрипт
  2. И при запуске скрипта он сказал мне, что имя рабочего процесса отсутствует
person rajmohan k    schedule 26.09.2019