it-swarm.com.ru

Искровая ошибка: ожидаемые нулевые аргументы для построения ClassDict (для numpy.core.multiarray._reconstruct)

У меня есть датафрейм в Spark, в котором один из столбцов содержит массив. Теперь я написал отдельный UDF, который преобразует массив в другой массив только с разными значениями. Смотрите пример ниже:

Пример: [24,23,27,23] должен быть преобразован в [24, 23, 27] Код:

def uniq_array(col_array):
    x = np.unique(col_array)
    return x
uniq_array_udf = udf(uniq_array,ArrayType(IntegerType()))

Df3 = Df2.withColumn("age_array_unique",uniq_array_udf(Df2.age_array))

В приведенном выше коде Df2.age_array - это массив, к которому я применяю UDF для получения другого столбца "age_array_unique", который должен содержать только уникальные значения в массиве.

Однако, как только я запускаю команду Df3.show(), я получаю сообщение об ошибке:

net.razorvine.pickle.PickleException: ожидаемые нулевые аргументы для построения ClassDict (для numpy.core.multiarray._reconstruct)

Может кто-нибудь, пожалуйста, дайте мне знать, почему это происходит?

Спасибо!

21
Preyas

Источником проблемы является то, что объект, возвращаемый из UDF, не соответствует объявленному типу. np.unique не только возвращает numpy.ndarray, но также преобразует числовые значения в соответствующие типы NumPyнесовместимые с API DataFrame. Вы можете попробовать что-то вроде этого:

udf(lambda x: list(set(x)), ArrayType(IntegerType()))

или это (чтобы поддерживать порядок)

udf(lambda xs: list(OrderedDict((x, None) for x in xs)), 
    ArrayType(IntegerType()))

вместо.

Если вы действительно хотите np.unique, вы должны преобразовать вывод:

udf(lambda x: np.unique(x).tolist(), ArrayType(IntegerType()))
27
zero323

Вам нужно преобразовать окончательное значение в список Python. Вы реализуете функцию следующим образом: 

def uniq_array(col_array):
    x = np.unique(col_array)
    return list(x)

Это потому, что Spark не понимает формат массива. Чтобы передать объект Python, который Spark DataFrames понимает как ArrayType, необходимо преобразовать вывод в python list перед его возвратом.

1
user1632287