Как постобработать результаты Spark SQL без использования UDF - PullRequest
0 голосов
/ 07 марта 2019

Я прочитал

https://medium.com/teads-engineering/spark-performance-tuning-from-the-trenches-7cbde521cf60

Он предлагает не использовать UDF для экономии затрат на десериализацию / сериализацию.

В моем случае я сделал такой запрос

select MYFUN(f1, f2, ...) 
from A ...

Я использую MYFUN для пост-обработки результатов запроса строка за строкой, например, отправляя их в другой сервис.

def my_fun(f1, f2, ...):
   service.send(f1, f2, ...)

session.udf.register('MYFUN', my_fun)

Без использования UDF, я могу захотетьсохраните результаты запроса во фрейме данных Python или в таблице Parque в формате hdf, а затем прочитайте фрейм данных и обработайте фрейм данных один за другим.

Проблема в том, что размер таблицы результатов большой, может составлять 1 М строк,В таком случае, имеет ли смысл удалять UDF?

Как лучше всего заполнять результат Spark SQL другим сервисом?

1 Ответ

1 голос
/ 10 марта 2019

Пользовательские функции Python не рекомендуются с точки зрения производительности, но нет ничего плохого в том, чтобы использовать их при необходимости, как в этом случае: затраты на сериализацию / десериализацию, вероятно, смешны по сравнению с ожиданиями ввода-вывода, введенными вашим send.Так что, вероятно, нет смысла удалять UDF.

В более общем случае есть два способа, с помощью которых вы можете уменьшить объем используемой памяти при обработке кадра данных.Один из них, о котором вы уже упоминали, - это сохранение в файл и обработка файла.

Другой способ - использование toLocalIterator на вашем фрейме данных.Таким образом, вы будете выполнять итерацию на каждом из разделов информационного кадра: вы можете перераспределить информационный кадр, чтобы сделать разделы произвольного размера:

df =df.repartition(100)
for partition in df.toLocalIterator():
    for row in partition:
        send(row)

Таким образом ваши требования к локальной памяти уменьшатся до самого большого раздела вашего разделенного на разделы информационного кадра..

...