Я читаю файл Avro, который имеет вложенную схему со слишком большим количеством полей.например: employeeId, empName, empPersonalInfo.Address.city и т. д. Я хочу написать функцию parDo для получения только нескольких полей из записей конвейера (employeeId, empPersonalInfo.Address.city)
schema of an avro file is :
{
"namespace" : "studentjoin.avro",
"type" : "record",
"name" : "student",
"fields" : [
{"name": "personalInfo",
"type": { "type" : "array", "items": {
"type" : "record",
"name" : "studentinfo",
"fields": [
{"name": "studentId", "type": "int"},
{"name": "studentName", "type": ["string", "null"]},
{"name": "studentAddress", "type": {
"type" : "array", "items" : {
"type": "record", "name" : "addressInfo",
"fields":
[
{"name" : "streetName", "type": ["string", "null"] },
{"name": "city", "type": ["string","null"]}
] }}},
{"name": "studentBranch", "type": ["string", "null"]}
]
} }
}
]
}
, если естьнет вложенных полей, чем ниже, работает отлично:
fields_of_interest = (p | 'Projected' >> beam.Map(
lambda row: {f: row[f] for f in selected_fileld_names}))
В java SDk есть встроенная функция unnest, которая сначала конвертирует все вложенные поля на одном уровне, если в питоне возможны такие же вещи, как это будет полезно.