hive/sparksql-type在表达式中强制从日期到时间戳

rdrgkggo  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(301)

当我在sparksql中运行配置单元查询时,lhs( timestamp ) <= 右侧( date )对于相同的值 '2013-09-30' 不是平等对待。鉴于 CASTTIMESTAMP 在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             |
+---------------------+--+

我们有那么多的表达方式 DATE 以及 TIMESTAMP 所有查询的组合都将动态生成。所以,很难找到 CAST 所有位置的列或值。
有没有一种方法可以自动将表达式中的rhs/lhs转换为hive/sparksql中更高的数据类型(类型强制)?
在oracle11g中也尝试过类似的查询,效果很好 equal .
感谢你的帮助!!

yws3nbqq

yws3nbqq1#

的类型强制规则 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)))

对于字典排序的日期表示法,日期表示法先于同一日期的时间戳表示法。

相关问题