Apache spark 如何访问Spark数据帧中VectorUDT列的元素?

Apache spark 如何访问Spark数据帧中VectorUDT列的元素?,apache-spark,dataframe,pyspark,apache-spark-sql,apache-spark-ml,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,Apache Spark Ml,我有一个dataframe df,它有一个名为features的VectorUDT列。如何获取列的元素,比如第一个元素 我试着做了以下几件事 从pyspark.sql.functions导入udf first_elem_udf=udflambda行:row.values[0] df.selectfirst\u elem\u udfdf.features.show 但是我得到了一个net.razorvine.pickle.pickle异常:构建ClassDictfor numpy.dtype的参数

我有一个dataframe df,它有一个名为features的VectorUDT列。如何获取列的元素,比如第一个元素

我试着做了以下几件事

从pyspark.sql.functions导入udf first_elem_udf=udflambda行:row.values[0] df.selectfirst\u elem\u udfdf.features.show 但是我得到了一个net.razorvine.pickle.pickle异常:构建ClassDictfor numpy.dtype的参数应该为零。如果使用first\u elem\u udf=first\u elem\u udflambda row:row.toArray[0],则会出现相同的错误

我也尝试过explode,但我得到了一个错误,因为它需要数组或映射类型

我认为这应该是一种常见的操作。

将输出转换为浮点:

从pyspark.sql.types导入DoubleType 从pyspark.sql.functions导入lit、udf 第五章,i: 尝试: 返回浮点数v[i] 除值错误外: 一无所获 ith=udfith_u3;,双类型 用法示例:

从pyspark.ml.linalg导入向量 df=sc.parallelize[ 1,向量。稠密[1,2,3], 2,Vectors.sparse3[1],[9] ].toDF[id,功能] df.selectithfeatures,lit1.show +---------+ |ith_特征,1| +---------+ | 2.0| | 9.0| +---------+ 说明:

必须将输出值重新序列化为等效的Java对象。如果要访问值,请注意SparseVector,应使用item方法:

v、 值0.0 返回标准Python标量。类似地,如果要作为密集结构访问所有值,请执行以下操作:

v.toArray().tolist()

如果您喜欢使用spark.sql,可以使用follow自定义函数“to_array”将向量转换为数组。然后可以将其作为数组进行操作

 from pyspark.sql.types import ArrayType, DoubleType
 def to_array_(v):
        return v.toArray().tolist()
 from pyspark.sql import SQLContext
 sqlContext=SQLContext(spark.sparkContext, sparkSession=spark, jsqlContext=None) 
 sqlContext.udf.register("to_array",to_array_,  ArrayType(DoubleType()))
实例 输出
我遇到了同样的问题,无法使用explode。您可以做的一件事是使用pyspark.ml.feature库。像这样:

from pyspark.ml.feature import VectorSlicer
from pyspark.ml.linalg import Vectors
from pyspark.sql.types import Row

slicer = VectorSlicer(inputCol="features", outputCol="features_one", indices=[0])

output = slicer.transform(df)

output.select("features", "features_one").show()

对于任何试图将PySpark ML模型训练后生成的概率列拆分为可用列的人。这不使用UDF或numpy。这只适用于二进制分类。在这里,lr_pred是具有逻辑回归模型预测的数据帧

prob_df1=lr_pred.withColumnprobability,lr_pred[probability]。castString


prob_df=prob_df1。使用列'probabilityre',splitregexp_replaceprobability,^[|],[1]。castDoubleType

我最喜欢这个解决方案,但它仍然会导致features_one列成为一个单元素列表。
    id  features    Second
0   1   [1.0, 2.0, 3.0] 2.0
1   2   (0.0, 9.0, 0.0) 9.0
from pyspark.ml.feature import VectorSlicer
from pyspark.ml.linalg import Vectors
from pyspark.sql.types import Row

slicer = VectorSlicer(inputCol="features", outputCol="features_one", indices=[0])

output = slicer.transform(df)

output.select("features", "features_one").show()