Pyspark如何校验列的日期格式?编写校验代码报TypeError求助
报错核心原因
- 传入
F.when的判断条件不符合要求:isNotNull是Pyspark Column类的内置方法,必须加括号调用才会生成对应的判断逻辑(也就是Column类型的表达式)。原代码里写的F.to_date("Date","dd/mm/yyyy").isNotNull没有加括号,实际传入的是一个Python方法对象,不是可用于条件判断的Column对象,直接触发TypeError: condition should be a Column报错。 - 格式占位符书写错误:Pyspark的日期格式占位符区分大小写,代表月份的占位符是大写
MM,小写mm会被识别为分钟字段。原代码里写的"dd/mm/yyyy"里用了小写mm,哪怕其他逻辑修复,解析出来的日期结果也会全部不符合预期。 - 分支取值未定义:代码里写的
Y、No是没有提前声明的裸标识符,没有加字符串引号,哪怕判断逻辑修复,也会触发“变量未定义”的报错。
正确的校验实现
首先需要提前导入Pyspark的内置函数模块:
from pyspark.sql import functions as F
调整后的可运行校验代码:
df_out = df.withColumn( "output", F.when( # 按照日/月/年的规则转日期,转换成功(非空)则标记为合规 F.to_date(F.col("Date"), "dd/MM/yyyy").isNotNull(), "Y" ).otherwise("N") ) df_out.show()
对应测试样例的输出说明
结合给出的测试数据集,运行后会得到如下校验结果:
12/12/2020:符合日/月/年格式,日期转换成功,output为Y24/01/2019:24为合法日期、01为合法月份,转换成功,output为Y08/09/2018:符合格式要求,转换成功,output为Y12/24/2020:按dd/MM/yyyy规则解析时,24为月份字段,超出1-12的合法范围,转换失败返回null,output为NNan:非日期有效内容,转换失败返回null,output为N
补充说明:Pyspark的to_date函数遇到格式不匹配的字符串时,不会抛出运行时错误,只会返回null,刚好可以利用这个特性完成格式合规性校验——只要转换后的值非空,就代表原字符串完全匹配指定的日期格式规则。
内容的提问来源于stack exchange,提问作者sirisha
相关产品推荐
相关产品推荐

