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 中的 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 中的更高数据类型(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 - 在表达式中键入从日期到时间戳的强制转换的主要内容,如果未能解决你的问题,请参考以下文章

Java采用JDBC的方式连接Hive(SparkSQL)

如何在 Hive/Spark SQL 中使用窗口函数删除重叠

spark hive区别

60分钟内从零起步驾驭Hive实战

无法从 impala/hive/spark sql 访问“spark 注册表”

Spark SQL metaData配置到Mysql