Apache spark 如何访问Spark数据帧中VectorUDT列的元素?
我有一个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标量。类似地,如果要作为密集结构访问所有值,请执行以下操作: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的参数
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()