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

如何将CSV中的数组类型列数据加载到Spark DataFrame中

问题原因

Spark 内置的 CSV 数据源原生不支持直接将字段解析为 Array 类型,因此你在读取阶段直接指定包含 ArrayType 的 Schema 会抛出不支持类型的异常。你需要先将数组字段读取为字符串格式,再通过函数转换为数组类型。

实现方案

步骤1:读取CSV并转换基础字段类型

先读取CSV文件,将数值类型的age、experience转换为整数,languages字段先保留字符串格式,同时可选处理name字段多余的单引号:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.IntegerType

// 读取原始CSV
val rawDf = spark.read.format("csv")
  .option("header", true)
  .load("data.csv")

// 转换基础字段类型
val baseDf = rawDf
  // 去掉name字段前后的单引号,不需要可以删除该行
  .withColumn("name", regexp_replace(col("name"), "'", ""))
  .withColumn("age", col("age").cast(IntegerType))
  .withColumn("experience", col("experience").cast(IntegerType))

步骤2:将字符串格式的languages转换为数组类型

有两种常用转换方式:

方式1:正则替换+分割(通用场景)

通过正则去掉字符串中的方括号和单引号,再按逗号分割得到数组:

val finalDf = baseDf
  .withColumn("languages", 
    split(
      // 去掉方括号、单引号
      regexp_replace(col("languages"), "[\\[\\]']", ""),
      // 按逗号加任意数量空格分割,避免元素带多余空格
      ",\\s*"
    )
  )

方式2:JSON解析(数组为标准JSON格式场景)

如果你的languages字段是标准JSON数组格式,也可以用from_json直接解析:

import org.apache.spark.sql.types.ArrayType
import org.apache.spark.sql.types.StringType

val finalDf = baseDf
  .withColumn("languages", from_json(col("languages"), ArrayType(StringType)))

步骤3:验证转换结果

// 打印Schema
finalDf.printSchema()
// 打印数据
finalDf.show()

输出的Schema符合预期:

root
 |-- name: string (nullable = true)
 |-- age: integer (nullable = true)
 |-- languages: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- experience: integer (nullable = true)

注意:你提供的CSV样例最后一行缺少分隔languages和experience字段的逗号,实际使用前请先修正CSV格式,避免解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:27:05