Hive/SparkSQL -类型强制转换从日期到时间戳的表达式



当我在Spark SQL中运行Hive查询时,LHS (timestamp) <= RHS (date)对于相同的值'2013-09-30' 不视为相等。而TIMESTAMPCAST在RHS中表现良好。

> SELECT CASE
           WHEN CAST(ADD_MONTHS(CAST('2013-09-30' AS DATE), +1) AS TIMESTAMP) <= ADD_MONTHS(CAST('2013-09-30' AS DATE), +1) 
            THEN 'less than or equal'
           ELSE 'greater'
       END AS TIMESTAMP_LTE_DATE
FROM
VALUES(1);
+---------------------+--+
| TIMESTAMP_LTE_DATE  |
+---------------------+--+
| greater             |
+---------------------+--+

我们有这么多的表达式与DATETIMESTAMP的组合,更多的查询将动态生成。所以,很难在所有的地方找到和CAST列或值。

是否有一种方法来自动转换RHS/LHS表达式到更高的数据类型(类型强制转换)在Hive/SparkSQL ?

在Oracle 11g中也尝试了类似的查询,它可以很好地运行到equal

谢谢你的帮助!

不幸的是,TimestampType/DateType比较的类型强制转换规则是硬编码的,并且将两边都转换为StringType:

// Comparisons between dates and timestamps.
case p @ BinaryComparison(left @ TimestampType(), right @ DateType()) =>
  p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType)))
case p @ BinaryComparison(left @ DateType(), right @ TimestampType()) =>
  p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType)))

和按字典顺序排列的日期表示法中,日期表示法在同一日期的时间戳表示法之前。

相关内容

  • 没有找到相关文章