如何从PySpark的VectorUDT稀疏向量中提取values字段
提取PySpark VectorUDT列的values值成数组
核心原因
你看到的JSON格式只是笔记本的显示形式,实际列存储的是pyspark.ml.linalg.SparseVector对象,不是字符串,所以不能直接按字符串解析,得用向量专属的操作方法。
推荐方法(Spark 3.0+)
用Spark内置的vector_to_array函数,高效又不用写自定义逻辑:
from pyspark.sql import functions as F # 假设你的DataFrame是df,向量列名为vec_col1、vec_col2 df = df.withColumn("values_col1", F.vector_to_array(F.col("vec_col1"))) df = df.withColumn("values_col2", F.vector_to_array(F.col("vec_col2")))
兼容低版本Spark的方法(自定义UDF)
如果你的Spark版本低于3.0,就写个简单的UDF处理稀疏/稠密向量:
from pyspark.sql import functions as F from pyspark.sql.types import ArrayType, FloatType from pyspark.ml.linalg import SparseVector, DenseVector def get_vector_values(vec): if isinstance(vec, SparseVector) or isinstance(vec, DenseVector): return vec.values.tolist() return [] # 注册UDF extract_values_udf = F.udf(get_vector_values, ArrayType(FloatType())) # 生成新列 df = df.withColumn("values_col1", extract_values_udf(F.col("vec_col1"))) df = df.withColumn("values_col2", extract_values_udf(F.col("vec_col2")))
验证结果
运行后可以用select查看提取效果:
df.select("vec_col1", "values_col1").show(truncate=False)
内容的提问来源于stack exchange,提问作者S.S.
相关产品推荐
相关产品推荐

