热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SparkSQL和Hive在处理日期/时间上的差异

博主历时三年倾注大量心血创作的《大数据平台架构与原型实现:数据中台建设实战》一书已由知名IT图书品牌电子工业出版社博文视点出版发行,真诚推荐给每一位读者

博主历时三年倾注大量心血创作的《大数据平台架构与原型实现:数据中台建设实战》一书已由知名IT图书品牌电子工业出版社博文视点出版发行,真诚推荐给每一位读者!点击《重磅推荐:建大数据平台太难了!给我发个工程原型吧!》了解图书详情,扫码进入京东手机购书页面!

在这里插入图片描述

 

 

注: 本文使用的环境是:Spark:2.2, Hive: 1.2.1

最近在编写一个SQL的过程中遇到了这样一个陷阱:为了便于工作,SQL的编写是通过一个SQL的IDE环境以Hive JDBC驱动的方式连接到HIVE上去执行的,SQL在HIVE上执行正常,有结果数据返回。但是SQL开发好在程序执行时通过Spark-SQL来运行的,SQL可以成功执行,没有报出任何语法错误,但是没有任何结果数据!在经过仔细查询后,发现问题出现在where条件中对理日期/时间字段的比较上。 以下where字句:

where creation_date >&#61; start_time and creation_date < end_time ....

其中creation_date是date类型&#xff0c;start_time和end_time是timestamp类型。虽然是两种时间类型&#xff0c;但是确实是可以直接比较大小的&#xff0c;人们会默认的转换规则是&#xff1a;对于date类型&#xff0c;如果要与timestamp类型进行比较&#xff0c;会默认在时间部分上补齐"00:00:00.00000000", 但是如果在不显式地指定这种转换下&#xff0c;默认的两个类型间的比较结果如下&#xff1a;

  • 使用原始字面量进比较

SQLHIVE执行结果SPARK-SQL执行结果
select ‘2019-01-01’ <‘2019-01-01 00:00:00’;truetrue
select ‘2019-01-01’ &#61; ‘2019-01-01 00:00:00’;falsefalse
select ‘2019-01-01’ <‘2019-01-01 00:00:00’;falsefalse

date类型的’2019-01-01’一定是比timestamp类型的’2019-01-01 00:00:00’要。虽然这有些怪异&#xff0c;但在hive和spark-sql上这一比较是一致的

  • 强制类型转换后进行比较

SQLHIVE执行结果SPARK-SQL执行结果
select cast(‘2019-01-01’ as date) falsetrue
select cast(‘2019-01-01’ as date) &#61; cast(‘2019-01-01 00:00:00’ as timestamp);truefalse
select cast(‘2019-01-01’ as date) > cast(‘2019-01-01 00:00:00’ as timestamp);falsefalse

这比较让人更加费解&#xff0c;本质上对于’2019-01-01’和’2019-01-01 00:00:00’两个字面量的类型转换都是它们本来的类型&#xff0c;对于Spark-SQL来说&#xff0c;它保持了和前一个版本以纯字面量比较一致的结果&#xff0c;但Hive的比较结果发生了变化&#xff0c;变成了“默认的那种”结果&#xff0c;这是有问题的。如果我们再一步的比较’2019-01-01’和cast(‘2019-01-01’ as date)&#xff0c;那么对于Hive的行为就更加难以理解了&#xff1a;

select &#39;2019-01-01&#39; &#61; cast(&#39;2019-01-01&#39; as date); -> hive: true, spark-sql: true

总之&#xff0c;Hive在处理date类型与timestamp类型的比较上是有问题的! 结果不符合人们的预期&#xff0c;所以最好的作法是将date类型转化为timestamp之后再进行比较&#xff01; 像下面这样&#xff1a;

SQLHIVE执行结果SPARK-SQL执行结果
select cast(‘2019-01-01’ as timestamp) falsefalse
select cast(‘2019-01-01’ as timestamp) &#61; cast(‘2019-01-01 00:00:00’ as timestamp);truetrue
select cast(‘2019-01-01’ as timestamp) > cast(‘2019-01-01 00:00:00’ as timestamp);falsefalse

推荐阅读
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • oracle avg row len,Oracle 估算数据库大小的方法
    一.说明一网友问我将一个查询的结果集存放到临时表里,如果估算临时表的大小,当时想的方法是通过统计block来计算。后来想,此方法的操作性也 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了使用jQuery实现图片预加载和等比例缩放的方法,同时提供了演示和相关代码。该方法可以重置图片的宽度和高度,并使图片在水平和垂直方向上居中显示。 ... [详细]
author-avatar
大地瓜1975
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有