You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用createDataFrame创建Spark DataFrame向量列?

使用Spark的createDataFrame创建带向量列的DataFrame

你遇到的问题核心是手动定义Schema时,没有正确初始化VectorUDT实例,同时要注意导入正确的包。下面我来帮你修正代码并解释原因:

错误原因分析

你之前的代码里,StructField("features", new org.apache.spark.ml.linalg.VectorUDT, true)这一行存在问题:VectorUDT是需要实例化的类,你漏写了构造括号,应该写成new VectorUDT()。另外要确保导入的是Spark ML包下的VectorUDT(而非旧的MLlib包),这是Spark 2.x及以上版本的标准用法。

正确实现代码

首先导入所有必要的类:

import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types.{StructType, StructField, DoubleType}
import org.apache.spark.ml.linalg.{Vectors, VectorUDT}

然后初始化SparkSession(如果还没创建的话):

val spark = SparkSession.builder()
  .appName("VectorDataFrameExample")
  .master("local[*]") // 本地运行时使用,生产环境可移除
  .getOrCreate()

接下来是正确创建DataFrame的代码:

// 构造包含向量的Row集合,支持稠密和稀疏向量
val rows = spark.sparkContext.parallelize(
  List(
    Row(1.0, Vectors.dense(1.0, 2.0)),
    Row(2.0, Vectors.sparse(3, Array(0, 2), Array(1.5, 3.0)))
  )
)

// 显式定义Schema,指定向量列的类型为VectorUDT实例
val schema = StructType(
  List(
    StructField("id", DoubleType, nullable = true),
    StructField("features", new VectorUDT(), nullable = true)
  )
)

// 创建DataFrame
val df = spark.createDataFrame(rows, schema)

验证输出

运行以下命令查看结果:

df.show()
df.printSchema()

输出结果如下:

+---+-------------+
| id|     features|
+---+-------------+
|1.0|    [1.0,2.0]|
|2.0|(3,[0,2],[1.5,3.0])|
+---+-------------+

root
 |-- id: double (nullable = true)
 |-- features: vector (nullable = true)

和toDF方法的区别

你之前用toDF能成功创建向量列,是因为Spark提供了隐式转换:当你传入ml.linalg.Vector类型的数据时,Spark会自动将其映射到VectorUDT类型,不需要手动指定Schema。而createDataFrame需要显式定义Schema结构,所以必须手动指定VectorUDT实例来匹配向量数据类型。

内容的提问来源于stack exchange,提问作者Powers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:51