Есть ли способ получить несколько полей из вложенных записей конвейера пучка? - PullRequest
0 голосов
/ 12 июня 2019

Я читаю файл 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, которая сначала конвертирует все вложенные поля на одном уровне, если в питоне возможны такие же вещи, как это будет полезно.

1 Ответ

0 голосов
/ 18 июня 2019
pl = (pl |
      "Extract" >> beam.Map(lambda x:
         (x["student"]["personalInfo"][0]["studentInfo"]["studentId"], x["student"]["personalInfo"][0]["studentInfo"]["studentAddress"][0]["addressInfo"]))

Вы не можете просто сгладить словарь, он содержит списки (определяемые 'type':'array', что означает, что есть разные способы сгладить его. Что если есть несколько адресов (с несколькими названиями городов)?first или all? В приведенной выше реализации он возвращает только первый элемент.

...