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の場合)の構築に必要な引数がゼロであること
誰かがこれが起こっている理由を教えてもらえますか?
ありがとう!
問題の原因は、UDFから返されたオブジェクトが宣言された型に適合しないことです。 np.unique
はnumpy.ndarray
を返すだけでなく、数値を対応するNumPy
型に変換します 互換性がないDataFrame
APIを使用。次のようなものを試すことができます:
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()))
最終値をpythonリストに変換する必要があります。次のように関数を実装します。
def uniq_array(col_array):
x = np.unique(col_array)
return list(x)
これは、Sparkがnumpy配列形式を理解しないためです。 python DataFramesがArrayType
として理解するSparkオブジェクトにフィードするには、出力を返す前にpython list
に変換する必要があります。
Pysparkバージョン2.4では、array_distinct変換を使用できます。
http://spark.Apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.array_distinct