2

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

> 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.

感谢你的帮助!!

4

1 回答 1

2

不幸的是/比较的类型强制规则TimestampTypeDateType是硬编码的,并将双方转换为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)))

并且使用字典顺序日期表示日期表示在同一日期的时间戳表示之前。

于 2016-11-01T16:35:35.433 回答