Spark Error:构造ClassDict的预期零参数(对于numpy.core.multiarray._reconstruct)

Pre*_*yas 31 arrays user-defined-functions apache-spark apache-spark-sql pyspark

我在Spark中有一个数据框,其中一个列包含一个数组.现在,我编写了一个单独的UDF,它将数组转换为另一个只有不同值的数组.见下面的例子:

例:[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))
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,Df2.age_array是我在其上应用UDF以获取不同列的数组,该列"age_array_unique"应该只包含数组中的唯一值.

但是,只要我运行该命令Df3.show(),我就会收到错误:

net.razorvine.pickle.PickleException:构造ClassDict的预期零参数(对于numpy.core.multiarray._reconstruct)

任何人都可以让我知道为什么会这样吗?

谢谢!

zer*_*323 43

问题的根源是从UDF返回的对象不符合声明的类型.np.unique不仅返回numpy.ndarray,还将数字转换为与API 不兼容的相应NumPy类型.你可以尝试这样的事情:DataFrame

udf(lambda x: list(set(x)), ArrayType(IntegerType()))
Run Code Online (Sandbox Code Playgroud)

或者这个(保持秩序)

udf(lambda xs: list(OrderedDict((x, None) for x in xs)), 
    ArrayType(IntegerType()))
Run Code Online (Sandbox Code Playgroud)

代替.

如果你真的想要np.unique转换输出:

udf(lambda x: np.unique(x).tolist(), ArrayType(IntegerType()))
Run Code Online (Sandbox Code Playgroud)

  • `numpy` 也把我搞砸了。就我个人而言,我用的是`hypot`、`radians`和`cos`,所有这些在`math`中也有,它的版本没有这个问题,所以我干脆把`from numpy`切换到`from math ` (2认同)
  • 2022 年,这仍然相关仅供参考 (2认同)

小智 5

您需要将最终值转换为 python 列表。您按如下方式实现该功能:

def uniq_array(col_array):
    x = np.unique(col_array)
    return list(x)
Run Code Online (Sandbox Code Playgroud)

这是因为 Spark 不理解 numpy 数组格式。为了提供 Spark DataFrames 理解为 的 python 对象ArrayType,您需要list在返回之前将输出转换为 python 。


Cle*_*ang 5

当我的 UDF 返回一个浮点数但我忘记将其转换为浮点数时,我也会遇到此错误。我需要这样做:

retval = 0.5
return float(retval)
Run Code Online (Sandbox Code Playgroud)