web-dev-qa-db-ja.com

Spark Error:ClassDictの構築のためのゼロ引数が必要です(numpy.core.multiarray._reconstructの場合)

Sparkにデータフレームがあります。この列では、列の1つに配列が含まれています。 :

例:[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:ClassDict(numpy.core.multiarray._reconstructの場合)の構築に必要な引数がゼロであること

誰かがこれが起こっている理由を教えてもらえますか?

ありがとう!

28
Preyas

問題の原因は、UDFから返されたオブジェクトが宣言された型に適合しないことです。 np.uniquenumpy.ndarrayを返すだけでなく、数値を対応するNumPy型に変換します 互換性がないDataFrame AP​​Iを使用。次のようなものを試すことができます:

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

またはこれ(順序を保つため)

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

代わりに。

np.uniqueが本当に必要な場合は、出力を変換する必要があります。

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

最終値をpythonリストに変換する必要があります。次のように関数を実装します。

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

これは、Sparkがnumpy配列形式を理解しないためです。 python DataFramesがArrayTypeとして理解するSparkオブジェクトにフィードするには、出力を返す前にpython listに変換する必要があります。

4
user1632287

Pysparkバージョン2.4では、array_distinct変換を使用できます。
http://spark.Apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.array_distinct

0
Crow59