如何将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
相关产品推荐
相关产品推荐

