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

Apache Spark指定CSV Schema报错:dataType应为DataType

解决Spark自定义Schema时的"dataType should be DataType"错误

嘿,我一眼就瞅出问题所在了,咱们一步步来修复:

1. 核心错误:TimestampType的使用方式不对

你在定义StructField的时候,写的是TimestampType(类本身),但Spark需要的是DataType的实例,也就是TimestampType()(带括号的实例化形式)。这就是触发断言错误的直接原因——Spark检查到你传入的不是一个合法的DataType实例。

2. 次要问题:自定义Schema未被使用

你虽然定义了schema变量,但在读取CSV的时候并没有指定使用它,反而开启了inferSchema='true',这会让Spark自动推断字段类型,完全忽略你自定义的schema,这显然不是你想要的效果。

修正后的完整代码

from pyspark.sql import SQLContext 
from pyspark.sql.types import * 

sqlContext = SQLContext(sc) 

# 修正TimestampType为实例形式
schema = StructType([ 
    StructField("c0", StringType(), True),
    StructField("c1", StringType(), True),
    StructField("c2", StringType(), True),
    StructField("c3", TimestampType(), True),  # 这里加了括号
    StructField("c4", TimestampType(), True),  # 这里也加了括号
    StructField("c5", StringType(), True),
    StructField("c6", StringType(), True),
    StructField("c7", StringType(), True),
    StructField("c8", StringType(), True),
    StructField("c9", StringType(), True),
    StructField("c10", StringType(), True),
    StructField("c11", StringType(), True),
    StructField("c12", StringType(), True),
    StructField("c13", StringType(), True),
    StructField("c14", StringType(), True),
    StructField("c15", StringType(), True),
    StructField("c16", StringType(), True),
    StructField("c17", StringType(), True) 
]) 

# 读取时指定自定义schema,关闭inferSchema
df = sqlContext.read.load(
    'good_loc.csv', 
    format='com.databricks.spark.csv', 
    header='false', 
    schema=schema  # 指定我们定义的schema
    # 移除了inferSchema='true',避免冲突
)

额外说明

  • 所有的Spark类型(比如StringType、IntegerType等)在作为StructField的dataType参数时,都需要写成带括号的实例形式,因为它们都是DataType的子类,必须实例化后才能被识别。
  • 如果你需要保留inferSchema,那自定义schema就没必要写了,但显然你是想强制指定字段类型,所以优先使用自定义schema更稳妥。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:55:29