Spark中布尔与字符串、日期/时间戳与字符串的比较规则咨询
Spark 跨类型比较的类型转换逻辑
布尔值与字符串的比较
针对你提到的SQL语句:
SELECT 'true' = true;
Spark的处理逻辑是把字符串'true'转换为布尔值true,再进行布尔类型的相等比较,所以结果为true。这里要注意,只有当字符串是严格的'true'或'false'(小写)时才能成功转换,其他值会触发类型转换错误。
日期、时间戳与字符串的比较
字符串与日期比较
对于这条语句:
SELECT '2022-01-02' > date('2022-01-03');
Spark会将字符串'2022-01-02'转换为日期类型date('2022-01-02'),再按日期先后比较。因为2022-01-02早于2022-01-03,所以执行结果是false。
字符串与时间戳比较
再看这条时间戳比较的语句:
SELECT '2022-08-12 01:00:00.123456' < timestamp('2019-08-12 01:00:00.123456');
Spark同样会把字符串转换为时间戳类型timestamp('2022-08-12 01:00:00.123456'),再比较时间先后。2022年的时间戳晚于2019年的,所以结果是false。
通用规则总结
Spark处理跨类型比较时,会优先将字符串类型转换为对应的目标类型(布尔、日期、时间戳),前提是字符串格式符合目标类型的解析要求:
- 布尔类型:仅支持小写的'true'/'false'字符串
- 日期类型:默认支持
yyyy-MM-dd格式,可通过配置自定义格式 - 时间戳类型:默认支持
yyyy-MM-dd HH:mm:ss[.SSS...]格式
如果字符串无法被解析为目标类型,Spark会直接抛出类型转换异常。
内容的提问来源于stack exchange,提问作者Guoran Yun
相关产品推荐
相关产品推荐

