SparkSQL中给不同格式日期加1天的实现方法及报错咨询
针对你提出的两个SparkSQL日期处理问题,我来一步步帮你解决:
问题1:为mm/dd/yyyy格式的日期添加1天
SparkSQL的date_add函数只认**日期类型(DateType)**的输入,直接传字符串肯定不行。所以得先把mm/dd/yyyy格式的字符串转成日期类型,加完天数后,要是需要还能转回原来的字符串格式。
举个实际的SQL例子,假设你的表叫user_events,日期列是event_date(存的是mm/dd/yyyy格式的字符串):
SELECT event_date AS original_date, -- 先转日期类型,再加1天 date_add(to_date(event_date, 'MM/dd/yyyy'), 1) AS date_plus_1, -- 如果需要转回mm/dd/yyyy格式的字符串 date_format(date_add(to_date(event_date, 'MM/dd/yyyy'), 1), 'MM/dd/yyyy') AS formatted_new_date FROM user_events;
⚠️ 这里要注意:格式字符串里的MM是大写的,代表月份;小写的mm是分钟,别搞混了,写错格式的话转日期会得到NULL!
问题2:dd/mm/yyyy格式日期用date_add报错“函数不存在”
其实date_add在Spark 1.5及以上版本就已经支持了,很少会真的“不存在”。你遇到这个错误,大概率是直接对字符串类型的日期调用了date_add,或者转日期时格式参数写错了,导致后续触发了异常。
解决思路还是先转日期类型,再执行加天数操作,示例如下:
假设你的数据集表叫sales_data,日期列是transaction_date(格式dd/mm/yyyy):
SELECT transaction_date AS original_date, -- 重点:用dd/MM/yyyy作为格式参数把字符串转成日期 date_add(to_date(transaction_date, 'dd/MM/yyyy'), 1) AS date_plus_1, -- 转回dd/mm/yyyy格式的字符串 date_format(date_add(to_date(transaction_date, 'dd/MM/yyyy'), 1), 'dd/MM/yyyy') AS formatted_new_date FROM sales_data;
要是还是报错,你可以排查这几点:
- 确认你的Spark版本是不是低于1.5(不过现在基本没人用这么老的版本了);
- 检查函数名和列名拼写,比如有没有把
date_add写成dateadd(少了下划线); - 看看日期列里有没有不符合dd/mm/yyyy格式的脏数据,这类数据转日期会得到
NULL,你可以用isnull(to_date(transaction_date, 'dd/MM/yyyy'))来筛选出脏数据排查。
内容的提问来源于stack exchange,提问作者prasanna kumar
相关产品推荐
相关产品推荐

