AWS Glue Crawler для столбца JSONB в PostgreSQL RDS

Я создал краулер, который просматривает таблицу PostgreSQL 9.6 RDS со столбцом JSONB, но краулер определяет тип столбца как "строку". Когда я затем пытаюсь создать задание, которое загружает данные из файла JSON на S3 в таблицу RDS, я получаю сообщение об ошибке.

Как я могу сопоставить источник файла JSON с целевым столбцом JSONB?


person Splendor    schedule 30.11.2017    source источник
comment
Сканер создает каталог таблиц со столбцами и типами, которые вы можете редактировать после его запуска. Можете ли вы войти в консоль Glue и попробовать изменить тип этого столбца на JSONB?   -  person Davos    schedule 05.07.2018


Ответы (2)


Это не совсем прямая копия, но подход, который сработал для меня, заключается в том, чтобы определить столбец в целевой таблице как ТЕКСТ. После того, как задание Glue заполнит поле, я конвертирую его в JSONB. Например:

alter table postgres_table
 alter column column_with_json set data type jsonb using column_with_json::jsonb;

Обратите внимание на использование приведения для существующих текстовых данных. Без этого столбец alter не работал бы.

person GlennS    schedule 22.06.2018

Сканер определит тип столбца JSONB как строку, но вы можете попробовать использовать класс Unbox в Glue для преобразования этого столбца в json.

давайте проверим следующую таблицу в PostgreSQL

create table persons (id integer, person_data jsonb, creation_date timestamp )

Вот пример одной записи из таблицы людей

ID = 1
PERSON_DATA = {
               "firstName": "Sergii",
               "age": 99,
               "email":"[email protected]"
               }
CREATION_DATE = 2021-04-15 00:18:06

В Glue необходимо добавить следующий код.

# 1. create dynamic frame from catalog 
df_persons = glueContext.create_dynamic_frame.from_catalog(database = "testdb", table_name = "persons", transformation_ctx = "df_persons ")
# 2.in path you need to add your jsonb column name that need to be converted to json
df_persons_json = Unbox.apply(frame = df_persons , path = "person_data", format="json")
# 3. converting from dynamic frame to data frame 
datf_persons_json = df_persons_json.toDF()

# 4. after that you can process this column as a json datatype or create dataframe with all necessary columns , each json data element can be added as a separate column in dataframe : 
final_df_person = datf_persons_json.select("id","person_data.age","person_data.firstName","creation_date")

Вы также можете проверить следующую ссылку:

https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-Unbox.html

person Sergii Sholovii    schedule 16.04.2021