проблема вывода схемы задания склеивания
Требование: мне нужна работа по склеиванию, чтобы получить данные 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)