当我在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
。
感谢您的帮助!!
答案 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)))
并且使用词典排序日期表示日期表示在同一日期的时间戳表示之前。