Как стать автором
Обновить

Комментарии 15

Ну, допустим, а можно теперь эту кастомную функцию как-то заппакеджить и дать дата-сайнтистам, которые на PySpark в основном? Особенно, если речь идёт о облачных средах, таких как Databricks или Glue?

Интересный кейс. Спасибо! В рамках своих изысканий попробую.
Пока я хочу использовать подобноное для своих Spark-приложений.

Вполне, вам нужно сделать джарник с таким кодом, а потом его добавить в зависимость spark-приложения, как условный драйвер для БД.

А в коде просто сделать импорт.

Но если мы говорим, про pySpark, скорее всего придется сделать питон враппер или вызывать через jvm

Еще интересный юзкейс для исследования - как сделать доступной эту функцию из Датабриск ноутбука, в котором дата-сайентисты исползуют PySpark

Посмотрел, да это может сработать через Jar и врапперы. Как посоветовал mitgard, нужно упаковать Jar, затем его указывать в spark-submit --jars. Враппер будет иметь вид вроде такого

from pyspark.sql.column import Column
from pyspark.sql.functions import expr

def my_catalyst_expression(column):
    return Column(expr(f"MyCatalystExpression({column._jc.toString()})"))

...
df.select(my_catalyst_expression(df.field)).show()

В случае databricks тогда все даже чуть проще, созданный Jar можно загрузить в Libraries у кластера.

Интересно!

Реализация генератора UUID с использованием UDF проста. 

Я бы хотел отметить, что на самом деле все не всегда так просто, даже для такой простой функции. Дело в том, что UDF сериализуются и передаются в executors, это во-первых (ну, те кто программирует на спарке, уже должны это обычно знать).

Но тут еще могут добавляться вопросы с класслоадерами. Скажем, мы как-то попытались создать экземпляр UDF и зарегистрировать его в groovy скрипте, который динамически выполнялся из кода на спарке. Так вот, ничего не получилось, потому что класслоадер оказался другой, и наша функция имела сигнатуру, отличную от нужной. А как устроены класслоадеры в спарке, описано примерно так же, как описано создание catalyst выражений из этой статьи - т.е. примерно никак.

Да, про сериализацию верно подмечено. Плюсую

eval(input: InternalRow)

Ну вот хорошо что у автора 0-арная функция. А если мы заходим использовать аргументы? Я пытался как-то разобраться с expressions, но так и уперся в отсутствие документации, скажем, непонятно где вот эти InternalRow взять, и что с ними можно делать.

В рамках собственных "раскопок" мне уже удалось создать функцию 2х и 3х аргументов - на эту тему и хочу подготовить уже свою статью

О, давайте-давайте, будем ждать.

Собственно я так и делал)

Спасибо автору за перевод

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории