PySpark 3.5 привнёс интересную новинку — UDTF (User-Defined Table Function). Если UDF возвращает одно значение, а UDAF агрегирует сразу несколько строк, то UDTF работает прямо в секции FROM и может вернуть целую таблицу строк для одного входного значения. Это открывает сценарии, которые раньше приходилось изобретать через обходные пути.
Что умеет UDTF? У вас есть текстовое поле, и вы хотите превратить каждое слово в отдельную строку. С UDF так не получится, он вернёт только одно значение. А UDTF легко «разворачивает» данные: одна входная строка превращается в десятки выходных. Таким образом можно:
• Разбивать текст на слова, списки на элементы
• Рраспаковывать коллекции или делать cartesian-развёртки
• Получать более гибкие трансформации без громоздкого кода
Как это выглядит? UDTF оформляется как Python-класс с методом eval, где можно yield-ить столько строк, сколько нужно. Например, разбиение строки на слова превращается в лаконичный цикл for word in text.split(): yield (word,). Результат в Spark будет выглядеть как таблица, где каждое слово — отдельная строка.
Другой пример — генерация чисел и их квадратов. Обычный цикл for num in range(start, end): yield (num, num*num) вернёт сразу множество строк. Всё прозрачно: одна запись на входе — много записей на выходе.
Зачем это в продакшене? Главное преимущество UDTF — гибкость. В задачах анализа данных часто нужно «развернуть» структуру: например, массив тегов превратить в таблицу или подсчитать все комбинации значений. Раньше такие приёмы были неудобными, теперь они встроены в PySpark.
UDTF — это 20% кода и 80% удобства. Теперь можно писать генераторы как в Python и получать готовые таблицы в Spark 💳
Data Science
