Spark SQL字符串转日期失败:格式解析返回null问题求助
解决Spark SQL中to_date解析带时区缩写的日期字符串返回null的问题
我帮你分析下问题所在,以及怎么修复:
首先,你当前的写法里把CEST直接硬写到格式字符串里了,这是不对的——Spark的日期解析器会把它当成字面量字符串去匹配,而不是识别为时区标识符。而且就算字面量匹配上了,也可能因为Locale的问题(比如默认Locale不是英文,导致Fri、Apr这些英文缩写无法被识别),最终返回null。
下面是具体的修复方案:
1. 使用正确的时区模式符
把格式字符串里的CEST替换成z,这个模式符专门用来匹配时区缩写(比如CET、CEST、UTC等)。修改后的格式字符串应该是:EEE MMM dd HH:mm:ss z yyyy
2. 指定英文Locale
因为你的日期字符串里的星期(Fri)和月份(Apr)都是英文缩写,如果Spark的默认Locale不是英文,解析会失败。可以在to_date函数里直接传入第三个参数指定Locale:
Dataset<Row> test = spark.sql("select to_date('Fri Apr 05 08:49:57 CEST 2019', 'EEE MMM dd HH:mm:ss z yyyy', 'en_US')" );
如果不想每次都写Locale参数,也可以在创建SparkSession的时候全局设置:
import org.apache.spark.sql.SparkSession; SparkSession spark = SparkSession.builder() .appName("DateParseDemo") .config("spark.sql.locale", "en_US") // 可选:设置默认时区,比如对应CEST的时区可以设为Europe/Paris .config("spark.sql.session.timeZone", "Europe/Paris") .getOrCreate(); // 之后执行SQL就不用传Locale参数了 Dataset<Row> test = spark.sql("select to_date('Fri Apr 05 08:49:57 CEST 2019', 'EEE MMM dd HH:mm:ss z yyyy')" );
额外提示:保留时间信息
如果你需要保留时分秒和时区信息,而不仅仅是日期,建议使用to_timestamp函数替代to_date:
select to_timestamp('Fri Apr 05 08:49:57 CEST 2019', 'EEE MMM dd HH:mm:ss z yyyy', 'en_US')
这样就能正确解析出包含时间的Timestamp类型了。
内容的提问来源于stack exchange,提问作者user2130951
相关产品推荐
相关产品推荐

