Я хочу реализовать функцию udf в scala, где схема вывода функции udf изменяется в соответствии со столбцами ввода. Входной фрейм данных выглядит следующим образом:
+-----+-----------------------+-----------------------------------------------------------+
|id |labels |words |
+-----+-----------------------+-----------------------------------------------------------+
|0 |["org", "date", "food"]|[["NASA"], ["7/2", "12 October"], ["apple","cherry","ice"]]|
|1 |["person", "event"] |[["Jack", "Norah"], ["marathon", "olympics", "run"]] |
+-----+-----------------------+-----------------------------------------------------------+
и в результате использования функции udf мне нужны разные схемы для каждой строки, желаемый результат - фрейм данных:
+-----+----------------------------------------------------------+
|id |list |
+-----+----------------------------------------------------------+
|0 |[["NASA"],["7/2", "12 October"], ["apple","cherry","ice"]]|
|1 |[["Jack", "Norah"],["marathon", "olympics","run"]] |
+-----+----------------------------------------------------------+
Here 'list'column аналогичен' words ', но схема отличается для обеих строк:
для первой строки, схема списка должна быть:
root
|-- list: struct (nullable = true)
| |-- org: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- date: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- food: array (nullable = true)
| | |-- element: string (containsNull = true)
и для второй строки:
root
|-- list: struct (nullable = true)
| |-- person: array (nullable = true)
| | |-- element: string (containsNull = true)
| |-- event: array (nullable = true)
| | |-- element: string (containsNull = true)
Я попробовал решение из здесь и один другой подход, определив функцию udf, например:
val customUDF = udf((a: Array[String], b: Array[Array[String]]) => {myFunc(a, b)}, schema)
, где myFunc обновляет объект схемы, который определен глобально. Заранее спасибо.