Я видел "ошибки" и другие проблемы со смешиванием векторизованных и не векторизованных UDF на фрейме данных pyspark и хочу понять правильный общий подход в будущем.
Из-за проблем с различиями между None в pyspark и nan в pandas я использовал обычный (не векторизованный) udf для очистки столбца списков в фрейме данных pyspark. После очистки я собираюсь использовать векторизованные или pandas UDF для масштабирования и нормализации данных, но сталкиваюсь с ошибкой:
IllegalArgumentException Traceback (most recent call last)
/content/spark-2.3.3-bin-hadoop2.7/python/pyspark/sql/utils.py in deco(*a, **kw)
77 raise QueryExecutionException(s.split(': ', 1)[1], stackTrace)
78 if s.startswith('java.lang.IllegalArgumentException: '):
---> 79 raise IllegalArgumentException(s.split(': ', 1)[1], stackTrace)
80 raise
81 return deco
IllegalArgumentException: 'Can not mix vectorized and non-vectorized UDFs'
Этот простой pandas udf, который вызвал это:
@pandas_udf(ArrayType(LongType()))
def func(v):
return pd.Series(v)
, который работает на небольшом примерном фрейме данных, в котором я не использовал какие-либо UDF (скалярные или иные) не хороший, чистый, умный или масштабируемый! Это работает, хотя. Должен ли нормальный подход использовать все UDF на кадре данных, отправить через цикл RDD wa sh, а затем использовать Pandas UDF? Какой лучший способ справиться с "смешиванием" udf?