Arrays Spark错误:构造ClassDict时应为零参数(对于numy.core.multiarray.\u)
Spark中有一个数据帧,其中一列包含一个数组。现在,我编写了一个单独的UDF,它将数组转换为另一个数组,其中只包含不同的值。见下例: 例如:[24,23,27,23]应转换为[24,23,27] 代码: 在上面的代码中,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:构
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>]