Spark读取JSON文件时遭遇ClassCastException类型转换异常求助
解决Spark读取JSON时的ClassCastException(GenericArrayData转UTF8String)
问题原因
这个类型转换异常的核心是你预先定义的json_schema与JSON文件中的实际数据类型不匹配:你把某个字段的类型定义为字符串(对应Spark内部的UTF8String),但文件里该字段的部分记录是数组类型(对应GenericArrayData),Spark按指定schema解析时强行转换就会抛出错误。
解决步骤
1. 定位类型不匹配的字段
先让Spark自动推断JSON的schema,和你定义的json_schema做对比,找出冲突字段:
# 临时读取文件,自动推断schema temp_df = spark.read.option("multiline","true").json('/home/hadoop/Spark/json_single_read.json') # 打印推断出的完整schema temp_df.printSchema()
重点对比哪些字段在你的json_schema里是StringType,但自动推断结果是ArrayType。
2. 修正schema定义
根据实际数据类型调整json_schema:
- 如果该字段确实应该是数组类型,直接把字段类型改成
ArrayType(StringType()),示例如下:
from pyspark.sql.types import StructType, StructField, StringType, ArrayType # 修正后的schema示例 json_schema = StructType([ StructField("id", StringType(), nullable=True), # 将原错误定义为StringType的tags字段改为数组类型 StructField("tags", ArrayType(StringType()), nullable=True), # 其他字段按需调整 ])
用修正后的schema重新读取文件即可。
3. 处理混合类型场景(可选)
如果该字段同时存在字符串和数组两种值,可在读取后将数组转换为字符串格式:
from pyspark.sql.functions import col, when, array_join # 先自动推断schema读取完整数据 temp_df = spark.read.option("multiline","true").json('/home/hadoop/Spark/json_single_read.json') # 假设目标字段为content,将数组转成逗号分隔的字符串 processed_df = temp_df.withColumn( "content", when(col("content").isinstance("array<string>"), array_join(col("content"), ",")) .otherwise(col("content").cast(StringType())) ) processed_df.show()
内容的提问来源于stack exchange,提问作者Shaheer Shah
相关产品推荐
相关产品推荐

