7

Sparkで列の1つに配列が含まれているデータフレームがあります。異なる値を持つ別の配列に配列します。Spark Error:ClassDict(numpy.core.multiarray._reconstruct用)の構築にゼロ引数が必要です

例:[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: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)

誰もがなぜこれが起こっている私に知らせてくださいことはできますか?

ありがとうございます!

答えて

13

問題の原因は、UDFから返されたオブジェクトが宣言された型に準拠していないことです。 np.uniquenumpy.ndarrayを返すだけでなく、数値を対応するNumPyタイプwhich are not compatibleDataFrame APIに変換します。

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

代わり

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

またはこれは、(順序を保つために):あなたはこのような何かを試すことができます。

あなたが本当に出力変換する必要がnp.uniqueたい場合:

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

誤植を?数値をNumPy型に変換します。これは互換性がありません " –

関連する問題