首页 > 解决方案 > 比较不同数据类型时,Spark 如何转换数据

问题描述

当我将 aInt与 a进行比较时String,Spark 会投射右侧

sql("SELECT 1621335543 >= '2021-05-18'").explain(true)

== Analyzed Logical Plan ==
(1621335543 >= CAST(2021-05-18 AS INT)): boolean
Project [(1621335543 >= cast(2021-05-18 as int)) AS (1621335543 >= CAST(2021-05-18 AS INT))#1309]
+- OneRowRelation

在这种情况下,Spark 将值转换'2021-05-18'Int,结果为NULL

但是当我将 aTimestamp与 a进行比较时String,Spark 会投射左侧

sql("SELECT current_timestamp() >= '2021-05-18'").explain(true)

== Analyzed Logical Plan ==
(CAST(current_timestamp() AS STRING) >= 2021-05-18): boolean
Project [(cast(current_timestamp() as string) >= 2021-05-18) AS (CAST(current_timestamp() AS STRING) >= 2021-05-18)#1313]
+- OneRowRelation

Spark 如何选择要转换的 DataType ?

标签: apache-sparkapache-spark-sql

解决方案


来自 spark 代码库的此评论与您的​​问题有关,以下应该是最新 spark 版本中的预期行为:

对于字符串和时间戳之间的相等性,我们将字符串转换为时间戳,以便亚秒精度舍入等事情不会影响比较。

火花代码的相关参考在这里。您使用的是哪个火花版本?


推荐阅读