Hive/SparkSQL - 在表达式中键入从日期到时间戳的强制转换
Posted
技术标签:
【中文标题】Hive/SparkSQL - 在表达式中键入从日期到时间戳的强制转换【英文标题】:Hive/SparkSQL - Type Coercion from date to timestamp in an expression 【发布时间】:2016-11-01 16:09:38 【问题描述】:当我在 Spark SQL 中运行 Hive 查询时,LHS (timestamp
) <=
RHS (date
) 对于相同的值 '2013-09-30'
不被视为平等。而 RHS 中的 CAST
和 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
组合的表达式,而且所有查询都将动态生成。所以,很难在所有地方找到CAST
列或值。
有没有办法将表达式中的 RHS/LHS 自动转换为 Hive/SparkSQL 中的更高数据类型(Type Coercion)?
在 Oracle 11g 中也尝试过类似的查询,它运行良好,转到 equal
。
感谢您的帮助!!
【问题讨论】:
差异解决方案的新答案(如果 spark 解决了下一个版本)/hack 总是受欢迎的。 【参考方案1】:不幸的是,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)))
并且使用字典顺序的日期表示,日期表示在同一日期的时间戳表示之前。
【讨论】:
以上是关于Hive/SparkSQL - 在表达式中键入从日期到时间戳的强制转换的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hive/Spark SQL 中使用窗口函数删除重叠