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

PySpark读取CSV时字符串转ArrayType报错问题咨询

PySpark读取CSV:将字符串格式数组转为ArrayType

问题说明

CSV文件中country字段以转义后的字符串形式存储数组数据(示例记录:1,"[""us"",""uk"",""jp""]"),直接用ArrayType<String>定义Schema读取时会报错:Column country has a data type of array, which is not supported by CSV。这是因为CSV数据源本身不支持直接解析数组类型,必须先以字符串读取,再转换为数组。

解决方案

步骤1:以字符串类型读取数据

首先定义包含StringType的Schema读取CSV,确保数据能正常加载:

from pyspark.sql.types import StructType, StructField, StringType, IntegerType
from pyspark.sql.functions import from_json

# 定义读取用Schema,country字段设为字符串类型
read_schema = StructType([
    StructField("id", IntegerType()),
    StructField("country", StringType())
])

# 读取CSV,注意修正原代码中的schema变量名错误(原代码用了schema_def但定义的是schema)
df = spark.read.option("header", "true") \
             .option("sep", ",") \
             .option("escape", '"') \
             .schema(read_schema) \
             .csv("<file_path>")

步骤2:将字符串转为数组类型

推荐两种转换方式:

方式一:使用from_json(推荐,兼容标准JSON格式)

由于country的字符串是标准JSON数组格式(转义后的),可以用from_json函数直接解析为数组:

from pyspark.sql.types import ArrayType

# 定义目标数组类型
array_schema = ArrayType(StringType())

# 转换字段类型
df = df.withColumn("country", from_json(df["country"], array_schema))

# 查看结果
df.show()

方式二:正则替换+分割(适合简单场景)

如果字符串格式固定,也可以通过正则去掉前后的方括号和多余引号,再按逗号分割:

from pyspark.sql.functions import regexp_replace, split

df = df.withColumn("country", 
                   split(
                       # 去掉首尾的["和"],再把中间的","替换为逗号
                       regexp_replace(regexp_replace(df["country"], "^\\[\"|\"\\]$", ""), "\"\",\"\"", ","), 
                       ","
                   )
                  )
df.show()

注意事项

  • CSV本身不支持复杂类型(如数组、结构体),必须先以基础类型读取再转换;
  • 原代码存在变量名错误:定义的Schema变量是schema,但读取时用了schema_def,需要修正;
  • from_json方法容错性更强,若字符串包含特殊字符(如元素内的逗号),仍能正确解析,优先推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:54:53