У меня есть задание Spark, которое обрабатывает некоторые данные в несколько отдельных фреймов данных. Я храню эти фреймы данных в списке, то есть фреймы данных []. В конце концов, я хотел бы объединить эти фреймы данных в иерархический формат и записать результат в avro. Схема avro выглядит примерно так:
{
"name": "mydata",
"type": "record",
"fields": [
{"name": "data", "type": {
"type": "array", "items": {
"name": "actualData", "type": "record", "fields": [
{"name": "metadata1", "type": "int"},
{"name": "metadata2", "type": "string"},
{"name": "dataframe", "type": {
"type": "array", "items": {
"name": "dataframeRecord", "type": "record", "fields": [
{"name": "field1", "type": "int"},
{"name": "field2", "type": "int"},
{"name": "field3", "type": ["string", "null"]}]
}
}
}]
}
}
}
]
}
Как можно предположить, каждый фрейм данных имеет три поля: field1, field2 и field3, которые я хотел бы записать в виде массива в файле avro. Также с каждым фреймом данных связаны некоторые метаданные.
Мой текущий подход заключается в том, чтобы после обработки этих данных записать фреймы данных в S3, а затем использовать отдельную программу для извлечения этих данных из S3, использовать библиотеку avro для записи файла avro, а затем снова загрузить его в S3.
Однако по мере роста объема данных это становится очень медленно. Я заглянул в библиотеку databricks, чтобы напрямую писать файлы avro, но я не знаю, как я могу объединить фреймы данных вместе в памяти или как библиотека databricks может определить схему, которую я использую.
Есть ли идиоматический способ сделать это в Spark?
P.S. Я использую EMR со Spark 2.0.0 на Python.