проблема вывода схемы задания склеивания

Требование: мне нужна работа по склеиванию, чтобы получить данные aws-Dynamodb(вложенная структура-комбинация карт и списка) в s3.

Мой подход: во-первых, я использовал динамический фрейм, чтобы собрать все данные из Dynamodb в один динамический фрейм.

datasource = glueContext.create_dynamic_frame.from_options(
             "dynamodb",
              connection_options={
                 "dynamodb.input.tableName": table_name,
                 "dynamodb.throughput.read.percent": read_percentage,
                 "dynamodb.splits": "100",
    }
)

после использования этого я получил datasource динамический фрейм со всеми данными.

здесь я хочу сделать какое-то преобразование и выполнить некоторые фильтры, поэтому я использовал концепцию pyspark dataframe.

df0 = datasource.toDF()

мой входной фрейм данных df0 содержит данные json collection в формате структуры, поэтому я использовал to_jsonпреобразовать структуру в json-строку. здесь мне нужна строка json, а не структура.

df1 = df0.select(to_json("collection"))

от df1, я получаю доступ ко всему, что хочу.

Главная проблема

некоторые атрибуты, присутствующие в коллекции, выглядят следующим образом

collection : { 
              "name" : "aaa",
               "id" : "111" ,
               "address" : "some address",
               "price" : 
                        {"string" : 1212.0 },
               "retailer" :
                         {"string" : "xxxx"},
               "categories" : "array": [
                                       "7216"
                                       ]
}

если вы видите пример выше price,reatiler,categories, типы данных отображаются как вложенный атрибут.

я хочу получить такой результат

collection : { 
              "name" : "aaa",
               "id" : "111" ,
               "address" : "some address",
               "price" : "1212.0",
               "retailer" :"xxxx",
               "categories" : "[7216]"
}

Как я могу решить эту проблему, дайте мне знать

2 ответа

Решение

Проблема, с которой вы сталкиваетесь, - это ожидаемое поведение, поскольку Glue дает вам возможность выбрать, какой тип данных вы хотите для столбца с неоднозначными типами в DynamicFrame.

ResolveChoice предоставляет информацию для разрешения неоднозначных типов в DynamicFrame с несколькими параметрами.

В зависимости от ваших требований вы можете выбрать любой из этих вариантов и решить проблему.

Другим решением может быть изменение типов ваших столбцов с помощью преобразования Map, которое применяет функцию ко всем записям DynamicFrame:

      inputDyf = glueContext.create_dynamic_frame_from_options(
    ...
)

def mapping(record: Dict[str, Any]):
    record["SomeVal"] = int(record["SomeVal"])
    # ... put, del and other dict operations
    return record 

mapped_dyF = Map.apply(frame=inputDyf, f=mapping)
Другие вопросы по тегам