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

时间:2016-11-01 16:09:38

标签: apache-spark hive apache-spark-sql apache-spark-2.0

当我在Spark SQL中运行Hive查询时, LHS timestamp<= RHS date)获得相同的值'2013-09-30' 不等同于。而RHS中CAST的{​​{1}}效果很好。

TIMESTAMP

我们有很多表达式,> 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列或值。

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

在Oracle 11g中也尝试过类似的查询,它可以正常运行CAST

感谢您的帮助!!

1 个答案:

答案 0 :(得分: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)))

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