PySpark中BigInt类型yyyyMMdd整数转MM-DD-YYYY日期方案
问题根因
转换结果全为null有两个核心原因:
- 日期解析格式和原始数据格式不匹配:
Date列是yyyyMMdd格式的整数(如20220716对应2022年7月16日),但代码里to_date传入的解析格式是MM-dd-yyyy,格式完全不匹配,无法正确解析 - 编写的Spark SQL缺少
SELECT关键字,本身存在语法错误
正确实现方案
注意逻辑顺序:必须先按照原始值的yyyyMMdd格式将整数转字符串后解析为标准日期类型,如果需要输出固定MM-dd-yyyy格式的字符串值,再对日期类型做格式化处理(标准日期类型本身不绑定展示格式)。
方案1:Spark SQL写法
from pyspark.sql.functions import * oe_seq = sqlContext.sql(""" SELECT *, -- 先按原始格式解析为日期,再格式化为MM-dd-yyyy格式字符串 date_format(to_date(cast(Date as string), 'yyyyMMdd'), 'MM-dd-yyyy') as DATE_FINAL FROM df1 """) oe_seq.registerTempTable("oe_seq") display(oe_seq)
如果需要DATE_FINAL为标准日期类型而非格式化字符串,去掉外层date_format函数即可,即写为to_date(cast(Date as string), 'yyyyMMdd') as DATE_FINAL。
方案2:PySpark DataFrame API写法
无需写SQL,直接用DataFrame内置函数实现:
from pyspark.sql.functions import col, to_date, date_format oe_seq = df1.withColumn( "DATE_FINAL", date_format(to_date(col("Date").cast("string"), "yyyyMMdd"), "MM-dd-yyyy") ) oe_seq.registerTempTable("oe_seq") display(oe_seq)
格式匹配规则提示:解析阶段的格式模板必须和输入值的排列完全对应,格式化阶段的模板才和最终输出的排列对应,二者不要搞混。
内容的提问来源于stack exchange,提问作者rbasu98
相关产品推荐
相关产品推荐

