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.