使用Spark SQL的to_date函数时遭遇ParseException错误求助
解决Spark SQL日期字符串转换ParseException问题
核心问题分析
你的日期字符串2022-11-15T08:45:36.905-0800包含毫秒部分.905,且时区偏移是不带冒号的-0800,同时原SQL存在三个关键错误:
- 格式字符串未匹配毫秒,且时区符号用错
- 把列名
create_dt用单引号包裹,导致解析的是字符串字面量而非表中列值 - 单引号嵌套引发SQL语法错误
修正方案
1. 正确的日期格式字符串
针对你的日期格式,正确的格式应为yyyy-MM-dd'T'HH:mm:ss.SSSZ:
.SSS匹配毫秒部分Z匹配不带冒号的时区偏移(如-0800,而ZZZZ对应带冒号的-08:00)
2. 修正后的SQL代码
解决引号嵌套问题,同时去掉列名的单引号:
df_3.createOrReplaceTempView("test") spark.sql("select to_date(create_dt, 'yyyy-MM-dd\\'T\\'HH:mm:ss.SSSZ') as testdt2 from test").show(n=20)
或者用单引号包裹整个SQL语句,双引号包裹格式字符串:
df_3.createOrReplaceTempView("test") spark.sql('select to_date(create_dt, "yyyy-MM-dd\'T\'HH:mm:ss.SSSZ") as testdt2 from test').show(n=20)
3. 更稳妥的替代方案(推荐)
利用to_timestamp自动兼容更多日期格式,再转为date:
df_3.createOrReplaceTempView("test") spark.sql("select to_date(to_timestamp(create_dt)) as testdt2 from test").show(n=20)
内容的提问来源于stack exchange,提问作者SPena
相关产品推荐
相关产品推荐

