hive中 <> 和 != 的区别

以前在建设数据仓库,处理数据的过程中,经常反复使用hive的HQL语句,尽管HQL和SQL语言有很多相同之处,但也并不是说HQL就能通用SQL的语法。在使用过程中要尤为注意。事情经过是这样的,我在把业务系统数据同步到数仓(数据存储在Hive)中时,在数据汇总层(DWS),对数据进行汇总处理时,发现有数据丢失的问题,经过排查,发现是在使用 <> 引发的坑。
Hive 中 != 或 <> 致命陷阱
业务场景:把业务数据抽到ODS层(原始数据层)、在DWS层(数据汇总层),对多张多表中的数据进行汇总操作,目的是为了补全各表的多种维度指标(维表)。

实际操作:因为是在Hive直接使用HQL语句对多表进行Join的关联查询操作,把处理完成的数据写入到提前建好的表中。跑完SQL以后,对结果数据进行验证,发现少了数百万数据,问题极其严重(在实际开发过程中,一定要对结果进行多方面的校验),开始排查问题。

排查问题:首先是对逻辑进行排查。发现逻辑并无错误,之后分解HQL,把每个SQL过滤条件单独拿出来进行验证,发现问题。 在使用 <> 产生了坑。

问题思考:在数仓建设过程中,因为工作疏忽,忘记了对ODS原始数据层的数据进行处理。因为在把ODS原始数据层的数据同步到到DWS数据汇总层时,并没有经过DWD数据明细层的处理,导致问题出现。

注意:在数仓建设过程,因为业务数据、或日志数据、或其他来源的数据。因为数据往往是很脏乱差的,我们需要对数据进行清洗操作,也就是ETL过程。但是数据仓库有个指标很重要,就是要把原始数据原封不动的同步到ODS层,在DWD层对数据进行简单处理。比如补全数据的操作,对NULL或空值进行补值操作。

对!= 或 <>实操验证
首先,先建一张表,插入数据:

create table if not exists not_eq_temp values(1,22,‘小李’,‘男’,‘销售’)(
id int comment ‘id’,
age int comment ‘年龄’,
name string comment ‘姓名’,
sex string comment ‘性别’,
job string comment ‘工作’
);

insert into table not_eq_temp values(1,22,‘小李’,‘男’,‘销售’);
insert into table not_eq_temp values(2,‘小张’,‘男’,‘’);
insert into table not_eq_temp values(3,26,‘小丽’,‘女’,‘文员’);
insert into table not_eq_temp values(4,22,‘小花’,‘女’,‘行政’);
insert into table not_eq_temp values(5,25,‘小王’,‘男’,‘’);
insert into table not_eq_temp values(6,24,‘小明’,‘男’,‘销售’);
然后,查询语句:

select id,age,name,sex,job from not_eq_temp where age <> 22
查询结果:

| 3| 26|‘小丽’|‘女’|‘文员’|
| 5| 25|‘小王’|‘男’| ‘’|
| 6| 24|‘小明’|‘男’|‘销售’|
可以看出来,id为2的这行数据,在查询过程中丢失了。因为这行数据,年龄没有采集到,为空,在使用<>时,会把为null值的也过滤掉,这显然不是我们想要的结果。

如何解决使用<>过滤 空值的问题?
方案一

这就需要用到我们前面说的补值操作。在DWD层对缺少或空值的记录进行补值处理。

具体方式:

select
id,
if(age is null,floor(rand()*100+200),age) AS age,
name,
sex,
job
from
not_eq_temp
注意:因为这里age是整数,我们使用floor(rand()*100+200) 来对age进行补值操作。这样做的好处是,使用rand()随机函数,有效避免数据倾斜情况的出现。

加200的目的,是为了跟正常年龄进行区别。在后续数据使用中,当我们看到200岁(目前来说没人能活200岁)以上的目标时,就能第一时间知道,这是我们补的值,原始业务数据并没有采集到年龄。

这只是一种情况,大家可以灵活使用。字段类型是字符串或其他类型时,补充对应类型的值就行。千万注意不要补同样的值,最好是随机数。

方案二

如果我们没有进行DWD层的操作,也就是没有补值操作。我们在查询数据的时候,可以使用条件判断避免出现null值被过滤的情况。

具体方式:

select id ,age ,name ,sex ,job from not_eq_temp where coalesce(age,1) <> 22
coalesce的用法,相当于if(expr is null,expr1,expr2)。

当然还有其他很多方式,我们可以在工作中,自己尝试。但是还是建议使用第一种方式,在DWD层对脏数据进行处理,因为这是建设数据仓库过程中很严格的规范要求。数据仓库中,一般dwd层就是用来对ods层数据进行简单处理的,如果不发挥这层的作用,那就有点不合时宜了。

使用不等值!= 或<>需要注意
在使用不等值:<>比较或过滤数据时,需要注意以下多种情况。

先来看看<>语法格式:

语法: A <> B

针对所有基本类型,如果表达式A为NULL,或者表达式B为NULL,返回NULL;如果表达式A与表达式B不相等,则为TRUE;否则为FALSE。

注意:在关系型数据库中,通常SQL的写法中不等于也可以这样写 != 。但在hive中,当一个string类型和int类型在进行比较的时候会查不出来结果。

数字和数字类型:可以用 != 比较;
带引号的数字和数字类型:也可以用!= 比较;
带引号的数字和带引号数字类型:还可以用 != 比较;
字符串和数字类型:不可以用 != 比较;
字符串和数字类型:不可以用 <> 比较;
总而言之,在使用!= 或 <>比较的时候两者的字段类型尽量保持一致

hive中 <> 和 != 的区别相关推荐

  1. 查询hive表_大数据中Hive与HBase的区别与联系

    二者区别 Hive:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能. Hive本身不存储和计算数据,它完全依赖于HDFS和MapRe ...

  2. hive中order by、distribute by、sort by和cluster by的区别和联系

    order by order by 会对数据进行全局排序,和oracle和mysql等数据库中的order by 效果一样,它只在一个reduce中进行所以数据量特别大的时候效率非常低.而且当设置 : ...

  3. 一文弄懂Hive中谓词下推(on与where的区别)

    文章目录 场景模拟 问题描述 Hive谓词下推 谓词下推概念 PPD 配置 基本概念 官网解释 规则总结 规则表 特殊说明 结论 场景模拟 数仓实际开发中经常会涉及到多表关联,这个时候就会涉及到on与 ...

  4. hive中内部表和外部表有什么区别?一般什么时候使用内部表什么时候使用外部表?

    hive中内部表和外部表有什么区别? 在使用hive搭建数据仓库的时候,可以建立两种表格.一种是内部表(managed table),一种是外部表(external table). 内部表建表是不加修 ...

  5. Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

    在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...

  6. Like rlike在hive中的区别

    Hive 中可以用 like 和 rlike 进行模糊匹配,like 采用的是 SQL 通配符,而 rlike 采用的是正则匹配. like % 代替 0 或多个字符 _ 代替一个字符 举个例子: - ...

  7. hive 中 order by、sort by、distribute by 、cluster by 区别

    1. select 语法 Hive 中的 SELECT 基础语法和标准SQL语法基本一致,支持 WHERE.DISTINCT.GROUP BY.ORDER BY.HAVING.LIMIT.子查询等.语 ...

  8. hive中order by,sort by, distribute by, cluster by作用以及用法

    1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会 ...

  9. Hive中排序和聚集

    //五种子句是有严格顺序的: where → group by → having → order by → limit //where和having的区别://where是先过滤再分组(对原始数据过滤 ...

  10. Spark _25.plus _使用idea读取Hive中的数据加载成DataFrame/DataSet(四)

    对Spark _25 _读取Hive中的数据加载成DataFrame/DataSet(四) https://georgedage.blog.csdn.net/article/details/10309 ...

最新文章

  1. mac phpstorm调试php,MAC下phpstorm20190302+Xdebug2.7断点调试PHP | 朱斌技术博客
  2. 经典背包问题 01背包+完全背包+多重背包
  3. 开发机器上利用vs2013调试远程IIS上的c#程序
  4. springMVC配置文件spring-servlet.xml中mvc:annotation-driven /的意义
  5. 宝宝头三年至关重要,不看悔掉肠子
  6. ssms2008 代码自动提示_使用 SSMS 的提示和技巧 - SQL Server Management Studio (SSMS) | Microsoft Docs...
  7. linux 下 .sh 文件语法
  8. python 工具ScreenShoot
  9. oracle数据库匿名快,pl/sql分匿名块和命名块
  10. retrofit与rxjava使用
  11. Windows win7下VMware Virtual Ethernet Adapter未识别网络解决方法
  12. java hashmap 无序_Map的有序和无序实现类,与Map的排序
  13. Freeradius+mysql+daloradius简单安装配置
  14. 架构之美-读书笔记之二
  15. 阿里大鱼短信接口PHP版,精简版阿里大鱼短信SMS发送接口PHP实例
  16. App下载的视频导进电脑中生成.mp4文件的方法
  17. HRBUST 1212 乘积最大
  18. 八月实施:电动自行车3c认证,电动自行车CCC认证费用周期,办理电动自行车ccc认证机构
  19. [原创摄影]西藏行(一)从不同角度看布达拉
  20. C# DLL HRESULT:0x8007000B

热门文章

  1. #华为云#听从你心,无问西东
  2. Flutter Image 参数详解
  3. vue文件在服务器上乱码,解决vue-pdf查看pdf文件及打印乱码的问题
  4. No active profile set, falling back to default profiles: default问题
  5. 顺丰旗下丰鸟无人机高薪诚聘海内外英才
  6. Apache启动失败,请检查相关配置。√MySQL5.1已启动。
  7. 最新《择善教育》C/C++黑客编程项目实战教程
  8. 出现了一些错误,请尝试重启Geforce Experience
  9. win7休眠、待机api
  10. IOS开发之——音乐播放器-功能封装(03)