Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Spark错误:构造ClassDict时应为零参数(对于numy.core.multiarray.\u)_Arrays_Apache Spark_Pyspark_Apache Spark Sql_User Defined Functions - Fatal编程技术网

Arrays Spark错误:构造ClassDict时应为零参数(对于numy.core.multiarray.\u)

Arrays Spark错误:构造ClassDict时应为零参数(对于numy.core.multiarray.\u),arrays,apache-spark,pyspark,apache-spark-sql,user-defined-functions,Arrays,Apache Spark,Pyspark,Apache Spark Sql,User Defined Functions,Spark中有一个数据帧,其中一列包含一个数组。现在,我编写了一个单独的UDF,它将数组转换为另一个数组,其中只包含不同的值。见下例: 例如:[24,23,27,23]应转换为[24,23,27] 代码: 在上面的代码中,Df2.age\u array是我在其上应用UDF以获得另一列“age\u array\u unique”的数组,该列应仅包含数组中的唯一值 但是,只要我运行命令Df3.show(),我就会得到错误: net.razorvine.pickle.PickleException:构

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

例如:[24,23,27,23]应转换为[24,23,27] 代码:

在上面的代码中,
Df2.age\u array
是我在其上应用UDF以获得另一列
“age\u array\u unique”
的数组,该列应仅包含数组中的唯一值

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

net.razorvine.pickle.PickleException:构造ClassDict(对于numpy.core.multiarray.\u)需要零个参数

谁能告诉我为什么会这样


谢谢

问题的根源在于从UDF返回的对象不符合声明的类型
np.unique
不仅返回
numpy.ndarray
,还使用
DataFrame
API将数字转换为相应的
numpy
类型。您可以尝试以下方法:

udf(lambda x: list(set(x)), ArrayType(IntegerType()))
或者这个(为了维持秩序)

相反

如果您确实想要
np.unique
,则必须转换输出:

udf(lambda x: np.unique(x).tolist(), ArrayType(IntegerType()))
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数组格式。为了向Spark DataFrames理解为
ArrayType
的python对象提供数据,您需要在返回它之前将输出转换为python
列表。

从pyspark 2.4版开始,您可以使用array\u distinct转换。

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

retval = 0.5
return float(retval)

下面的内容对我来说很好

[x.item()代表x英寸]

将其转换为纯python。

旁白:对于任何希望求和得到类似错误的数组的人(在pyspark中):u_sum=udf(lambda x:sum(x.tolist())。这里x可以是向量。在这里发布作为搜索该错误的第一个结果是此页面。
numpy
也把我搞砸了。就我个人而言,我使用的是
hypot
radians
cos
,所有这些都可以在
math
中找到,它们的版本没有这个问题,所以我只是将
从numpy
切换到
从math
retval = 0.5
return float(retval)
udf(lambda x: np.unique(x).tolist(), ArrayType(IntegerType()))
[x.item() for x in <any numpy array>]