7

Sütunlardan birinin bir dizi içerdiği Spark'de bir veri çerçevem ​​var. Şimdi, dönüştüren ayrı bir UDF yazdım. Sadece farklı değerlere sahip başka bir diziye dizilir.Spark Hata: ClassDict yapımı için beklenen sıfır argümanlar (numpy.core.multiarray._reconstruct için)

Ex: aşağıdaki örneğe bakınız [24,23,27,23] [, 24, 23 27] dönüştürülür kodu almak gerekir: Yukarıdaki kodu

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 dizisinde yalnızca benzersiz değerler içermesi gereken farklı bir sütun "age_array_unique" almak için UDF'yi uyguladığım dizidir.

net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)

kimse bunun neden olduğunu bana bildirin lütfen Can:

Ancak, en kısa zamanda komutunu Df3.show() çalıştırmak gibi ben hata alıyorum?

Teşekkürler!

cevap

13

Sorunun kaynağı, UDF'den döndürülen nesnenin bildirilen türe uygun olmamasıdır. np.unique yalnızca numpy.ndarray'u döndürmekle kalmaz, aynı zamanda DataFrame API'sı iletürlerini which are not compatible türlerine dönüştürür.

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

yerine

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

veya bu (düzeni sağlamak için): Böyle bir şey deneyebilirsiniz.

Eğer gerçekten çıkışını dönüştürmek zorunda np.unique isterseniz:

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

Yazım Hatasını? "ama aynı zamanda sayısalları [uyumlu değil] ilgili NumPy türlerine dönüştürür" –