PicklingError в Pyspark

Я написал ниже функцию в pyspark, чтобы получить deptid и вернуть фрейм данных, который я хочу использовать в spark sql.

защита get_max_salary (дептид):

sql_salary="выберите максимальную (зарплату) сотрудника, где depid = {}"

df_salary = spark.sql(sql_salary.format(deptid)) return df_salary spark.udf.register('get_max_salary',get_max_salary)

Однако я получаю сообщение об ошибке ниже. Я искал в Интернете, но нигде не мог найти подходящего решения. может кто-нибудь, пожалуйста, помогите мне здесь

Сообщение об ошибке — PicklingError: Не удалось сериализовать объект: Исключение: похоже, вы пытаетесь сослаться на SparkContext из широковещательной переменной, действия или преобразования. SparkContext можно использовать только в драйвере, а не в коде, который он запускает на рабочих процессах. Дополнительные сведения см. в SPARK-5063.


person Pyspark Developer    schedule 26.09.2019    source источник
comment
Еще одна вещь (вероятно, не решение). Возможно, в вашем коде есть опечатка, выберите максимальную (зарплату) от сотрудника, где вы имеете в виду сотрудника   -  person RacoonOnMoon    schedule 01.10.2019
comment
Привет, спасибо за ответ. Но проблема, похоже, связана с сериализацией в python.   -  person Pyspark Developer    schedule 01.10.2019
comment
Согласно Spark, функция python (включая лямбда-функцию) регистрируется как UDF, поэтому ее можно использовать в операторах SQL. аналогично функциям min или max. Насколько я знаю, вы не можете ссылаться на искровой контекст в UDF.   -  person Abraham    schedule 04.10.2019
comment
Я думаю, это неправильно. Я пробовал то же самое, используя Scala, но не смог этого сделать.   -  person Pyspark Developer    schedule 05.10.2019
comment
@PysparkDeveloper Удалось ли вам найти решение? Я сталкиваюсь с аналогичной проблемой. Любые материалы приветствуются. Версия - Искра 3.0.1   -  person Idleguys    schedule 06.12.2020
comment
Поскольку вы не предоставили свой код pusedo. Поэтому я предполагаю, что ваш код похож на то, что я разместил выше. Я не могу вспомнить, какие обходные пути у меня были год назад, но попробуйте этот объект сеанса ..spark, т.е. искра не должна быть используется с телом пользовательской функции либо создайте аргумент для fn для объекта сеанса искры, либо скажите self.spark.. если это не работает, создайте fn, который просто возвращает искровой код SQL и выполняет после него   -  person Pyspark Developer    schedule 07.12.2020