映射数据流中Parquet日期字符串转date、整数返回空值问题问询
核心原因
你遇到的转换结果返回Null的问题确实是默认日期解析格式不匹配导致的,你的原始日期字符串格式为dd-MMM-yyyy(日-英文月份缩写-四位数年份),各类数据处理引擎的默认日期解析规则不会自动识别英文月份缩写,必须手动指定解析格式才能正确转换。
具体实现方案
以下以最常用的Spark处理场景为例,其他引擎的写法逻辑一致,仅函数名和格式串标识有差异:
1. 转换为YYYY-MM-DD格式的Date类型列
直接使用to_date函数手动指定原始字符串的解析格式即可,若你的运行环境默认不是英文locale,需要额外指定英文环境避免月份缩写识别失败:
-- Spark SQL 写法 SELECT to_date(start_date, 'dd-MMM-yyyy') AS start_date_ymd, to_date(end_date, 'dd-MMM-yyyy') AS end_date_ymd FROM your_parquet_table
# PySpark 写法 from pyspark.sql.functions import to_date df = spark.read.parquet("你的parquet文件路径") df = df.withColumn("start_date_ymd", to_date("start_date", format="dd-MMM-yyyy")) df = df.withColumn("end_date_ymd", to_date("end_date", format="dd-MMM-yyyy"))
2. 转换为YYYYMMDD格式的整数类型列
在正确解析为Date类型的基础上,先转成对应格式的字符串再强转为整数即可:
-- Spark SQL 写法 SELECT CAST(date_format(to_date(start_date, 'dd-MMM-yyyy'), 'yyyyMMdd') AS INT) AS start_date_int, CAST(date_format(to_date(end_date, 'dd-MMM-yyyy'), 'yyyyMMdd') AS INT) AS end_date_int FROM your_parquet_table
# PySpark 写法 from pyspark.sql.functions import to_date, date_format df = df.withColumn("start_date_int", date_format(to_date("start_date", "dd-MMM-yyyy"), "yyyyMMdd").cast("int")) df = df.withColumn("end_date_int", date_format(to_date("end_date", "dd-MMM-yyyy"), "yyyyMMdd").cast("int"))
注意:你描述的格式名称和示例存在不一致,若你实际需要的是日在前的DDMMYYYY整数、DD-MM-YYYY日期格式,只需要把代码里的输出格式串调整为ddMMyyyy、dd-MM-yyyy即可。
如果你使用ClickHouse处理,对应函数写法如下:
-- 转Date类型 SELECT toDateOrNull(start_date, '%d-%b-%Y') AS start_date_ymd FROM your_table; -- 转整数类型 SELECT toInt32(formatDateTime(toDateOrNull(start_date, '%d-%b-%Y'), '%Y%m%d')) AS start_date_int FROM your_table;
注意事项
- 月份缩写的匹配必须和原始数据的语言一致,原始数据为英文Jan/Feb类缩写时,必须指定英文环境解析,使用中文环境会返回Null
- 转换前可先抽样校验原始数据格式,排除脏数据(如拼写错误的月份缩写、非法日期值、空值)导致转换结果为Null的情况
内容的提问来源于stack exchange,提问作者user2181700
相关产品推荐
相关产品推荐

