spark example arrays apache-spark pyspark apache-spark-sql user-defined-functions

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



spark sql example (2)

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 los números a los tipos NumPy correspondientes que no son compatibles con DataFrame API. 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 quiere np.unique , debe convertir la salida:

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

Tengo un marco de datos en Spark en el que una de las columnas contiene una matriz. Ahora, he escrito un UDF separado que convierte la matriz en otra matriz con valores distintos solo en ella. Ver ejemplo a continuación:

Ej: [24,23,27,23] debe convertirse al código [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))

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 la matriz.

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

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

¿Alguien puede decirme por qué sucede esto?

¡Gracias!


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 entiende el formato de matriz numpy. Para alimentar un objeto python que Spark DataFrames entiende como ArrayType , debe convertir el resultado a una list python antes de devolverlo.