Error de chispa: cero argumentos esperados para la construcción de ClassDict (para numpy.core.multiarray._reconstruct)

Tengo un dataframe en Spark en el que una de las columnas contiene una matriz. Ahora, he escrito una UDF separada que convierte la matriz en otra matriz con valores distintos solo en ella. Vea el siguiente ejemplo:

Ejemplo : [24,23,27,23] debería convertirse a [24, 23, 27] Código:

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)) 

En el código anterior, Df2.age_array es la matriz en la que estoy aplicando el UDF para obtener una columna diferente "age_array_unique" que debe contener solo valores únicos en el conjunto.

Sin embargo, tan pronto como ejecuto el comando Df3.show() , obtengo el error:

net.razorvine.pickle.PickleException: cero argumentos esperados para la construcción de ClassDict (para numpy.core.multiarray._reconstruct)

¿Puede alguien decirme por qué sucede esto?

¡Gracias!

El origen del problema es que el objeto devuelto por el UDF no se ajusta al tipo declarado. np.unique no solo devuelve numpy.ndarray sino que también convierte números a los tipos de NumPy correspondientes que no son compatibles con la API de DataFrame . Puedes probar algo como esto:

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

o esto (para mantener el orden)

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

en lugar.

Si realmente quieres np.unique debes convertir la salida:

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

Necesita convertir el valor final en una lista de Python. Implementa la función de la siguiente manera:

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

Esto se debe a que Spark no comprende el formato de matriz numpy. Para alimentar un objeto python que Spark DataFrames entiende como un ArrayType , debe convertir el resultado en una list Python antes de devolverlo.