在将 .toArray() 用于 Spark 向量之后,它应该是啥类型?

Posted

技术标签:

【中文标题】在将 .toArray() 用于 Spark 向量之后,它应该是啥类型?【英文标题】:What type should it be , after using .toArray() for a Spark vector?在将 .toArray() 用于 Spark 向量之后,它应该是什么类型? 【发布时间】:2017-08-25 03:52:58 【问题描述】:

我想将我的向量转移到数组中,所以我使用

get_array = udf(lambda x: x.toArray(),ArrayType(DoubleType()))
result3 = result2.withColumn('list',get_array('features'))
result3.show()

features 列是向量 dtype。但 Spark 告诉我

 net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for numpy.core.multiarray._reconstruct)

我知道原因一定是我在UDF中使用的类型所以我尝试了get_array = udf(lambda x: x.toArray(),ArrayType(FloatType())),它也无法工作。我知道它是转移后的numpy.narray,但我怎样才能正确显示它?

这是我如何获取数据框结果 2 的代码:

df4 = indexed.groupBy('uuid').pivot('name').sum('fre')
df4 = df4.fillna(0)
from pyspark.ml.feature import VectorAssembler 
assembler = VectorAssembler(
    inputCols=df4.columns[1:],
    outputCol="features")
dataset = assembler.transform(df4)
bk = BisectingKMeans(k=8,  seed=2, featuresCol="features")
result2 = bk.fit(dataset).transform(dataset)

这是索引的样子:

+------------------+------------+---------+-------------+------------+----------+--------+----+
|              uuid|    category|     code|   servertime|         cat|       fre|catIndex|name|
+------------------+------------+---------+-------------+------------+----------+--------+----+
|   351667085527886|         398|     null|1503084585000|         398|0.37951264|     2.0|  a2|
|   352279079643619|         403|     null|1503105476000|         403| 0.3938634|     3.0|  a3|
|   352279071621894|         398|     null|1503085396000|         398|0.38005984|     2.0|  a2|
|   357653074851887|         398|     null|1503085552000|         398| 0.3801652|     2.0|  a2|
|   354287077780760|         407|     null|1503085603000|         407|0.38019964|     5.0|  a5|
|0_8f394ebf3f67597c|         403|     null|1503084183000|         403|0.37924168|     3.0|  a3|
|   353528084062994|         403|     null|1503084234000|         403|0.37927604|     3.0|  a3|
|   356626072993852|   100000504|100000504|1503104781000|   100000504| 0.3933774|     0.0|  a0|
|   351667081062615|   100000448|      398|1503083901000|         398|0.37905172|     2.0|  a2|
|   354330089551058|1.00000444E8|     null|1503084004000|1.00000444E8|0.37912107|    34.0| a34|
+------------------+------------+---------+-------------+------------+----------+--------+----+

result2 中,我有一些类型为double 的列,然后我使用VectorAssembler 将这些双列组合成一个向量features,这是我要传输到数组的列。

【问题讨论】:

【参考方案1】:

NumPy types are not supported as the return values 为UserDefinedFunctions。您必须将输出转换为标准 Python list:

udf(lambda x: x.toArray().tolist(), ArrayType(DoubleType()))

【讨论】:

以上是关于在将 .toArray() 用于 Spark 向量之后,它应该是啥类型?的主要内容,如果未能解决你的问题,请参考以下文章

java从toArray返回Object[]到泛型的类型擦除

如何在 Java 中将 list.toArray() 方法用于二维数组

对象指针向量的元素 K 在将第 N 个元素从元素 K-1 推入向量后变为空

向量不会复制成数组吗?

在将对象插入向量时了解构造,复制和销毁

在将另一个实例添加到同一向量后引用的成员变量的引用