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

