首页 文章

Hive / SparkSQL - 在表达式中从日期到时间戳键入强制

提问于
浏览
2

当我在Spark SQL中运行Hive查询时, LHStimestamp<= RHSdate )为相同的值 '2013-09-30' is not treating as equal . 而RHS中 TIMESTAMPCAST 效果很好 .

> 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 列或值 .

有没有办法在Hive / SparkSQL中自动将表达式中的RHS / LHS转换为更高的数据类型( Type Coercion )?

在Oracle 11g中尝试了类似的查询,它工作正常_11505160_ .

感谢您的帮助!!

1 回答

  • 2

    不幸的是,type coercion rules for 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)))
    

    并且使用词典排序日期表示日期表示在同一日期的时间戳表示之前 .

相关问题