Удаление поля из большой структуры (spark dataframe)

Есть таблица, в полях вложенные структуры <array<struct ...>>

Например:

{
"problems": [{
    "Diabetes":[{
        "medications":[{
            "medicationsClasses":[{
                "className":[{
                    "associatedDrug":[{
                        "name":"asprin",
                        "dose":"",
                        "strength":"500 mg"
                    }],
                    "associatedDrug#2":[{
                        "name":"somethingElse",
                        "dose":"",
                        "strength":"500 mg"
                    }]
                }],
                "className2":[{
                    "associatedDrug":[{
                        "name":"asprin",
                        "dose":"",
                        "strength":"500 mg"
                    }],
                    "associatedDrug#2":[{
                        "name":"somethingElse",
                        "dose":"",
                        "strength":"500 mg"
                    }]
                }]
            }]
        }],
        "labs":[{
            "missing_field": "missing_value"
        }]
    }],
    "Asthma":[{}]
}]}

Необходимо удалить поле problems.Diabetes.medications.medicationsClasses.className.associatedDrug.dose

Аналог: https://stackoverflow.com/questions/32727279/dropping-a-nested-column-from-spark-dataframe

  1. В Spark >= 3.1 есть функция dropFields, пробовал, не помогло (возможно из-за массивов).
  2. Пробовал пересобрать структуру, но количество полей (примерно 2500) считаю большим для ручной переделки структуры. И не понятно как такое решение будет в prod работать. (Пока единственное решение)
  3. Read JSON schema и spark.read.schema(schema).parquet(path) выдаёт ошибку.
  4. Аналогично п.3 select(from_json(col, schema))

Была идея формировать JSON выходной файл и обрабатывать его различными библиотеками вроде fastjson. Но от решения отказался, т.к. файлов(строк в таблице) много.

Подскажите, может есть ещё какие-то идеи или Вы сталкивались/решали подобный кейс?


Ответы (1 шт):

Автор решения: Mark

Решено с помощью spark-hats, метод nestedDropColumn.

https://github.com/AbsaOSS/spark-hats

→ Ссылка