hive中的null
在处理流水增量表的时候,出现了一个判定的失误。
select a.a1,a.a2
from
(
select
a.a1
,if(a.a2<>b.b2,1,0) as diff
,a.a2
from a
lefter join b
on a.a1=b.b1
) c
where c.diff=1;
因为左外关联,可能会出现b表数据不存在 则b.b2 is null , if(a.a2<>b.b2,1,0) as diff,null值的判断只能使用is ,is not
0: jdbc:hive2://localhost:10000/big12> select if(1 <>null,0,1);
+------+--+
| _c0 |
+------+--+
| 1 |
+------+--+
1 row selected (0.13 seconds)
0: jdbc:hive2://localhost:10000/big12> select 1<>null;
+-------+--+
| _c0 |
+-------+--+
| NULL |
+-------+--+
1 row selected (0.127 seconds)
所以处理方式:
0: jdbc:hive2://localhost:10000/big12> select if(1<>null or null is null,1,0) as diff;
+-------+--+
| diff |
+-------+--+
| 1 |
+-------+--+
1 row selected (0.121 seconds)
0: jdbc:hive2://localhost:10000/big12> select if(1<>nvl(null,0),1,0) as diff;
+-------+--+
| diff |
+-------+--+
| 1 |
+-------+--+
1 row selected (0.13 seconds)
其他:
employee表
hive>desc employee;
empid string
deptid string
salary string
查询employee
hive>select * from employee
1 NULL NULL
hive 中null实际在HDFS中默认存储为'\N'(但是我们一般为了安全性把null的储存格式调整为'')
即employee中的数据在HDFS中为
1 \N \N
验证,插入'\N'
hive>insert into table employee select '','\\N','\\N' from employee limit 1;
其中多一个斜杠是转义的作用
查询employee
hive>select * from employee
1 NULL NULL
2 NULL NULL
此时hive中与null有关的函数,如nvl,coalesce,is null等判断是否为null是为true
hive>select nvl(empid,'A'),nvl(deptid,'B'),nvl(salary,'C') from employee
1 B C
2 B C
但是null或NULL和''会被hive当做字符串处理。
hive>insert into table employee select '','','' from employee limit 1;
查询:
hive>select * from employee;
1 NULL NULL
2 NULL NULL
3
hive>insert into table employee select '','null','NULL' from employee limit 1;
查询
hive>select * from employee;
1 NULL NULL
2 NULL NULL
3
4 null NULL
注意:1,2同一行的NULL与4行的NULL或null不一样。4行的NULL或null为字符串
此时hive中与null有关的函数,如nvl,coalesce,is null等判断''和null(字符串)或NULL(字符串)是否为null是为false
hive> select empid ,nvl(deptid,'E'),nvl(salary,'F') from employee;
1 E F
2 E F
3
4 null NULL
hive>select * from employee where deptid='';
3
hive>select * from employee where deptid='null' and salary ='NULL';
4 null NULL
hive>select * from employee where deptid is null;
1 NULL NULL
2 NULL NULL
可以通过
ALTER TABLE table_name SET SERDEPROPERTIES('serialization.null.format' = 定义描述符);
修改空值描述符
如果将''定义为NULL
ALTER TABLE employee SET SERDEPROPERTIES('serialization.null.format' = '');
查询employee
hive>select * from employee;
1 \N \N
2 \N \N
3 NULL NULL
4 null NULL
和前面的select比较发现''变成了NULL,而\N露出了真面目,4行的NULL或null为字符串没变化
验证,将''插入到emloyee
hive> insert into table employee select '','','' from employee limit 1;
查询
hive>select * from employee;
1 \N \N
2 \N \N
3 NULL NULL
4 null NULL
5 NULL NULL
注意:3,5同一行的NULL与4行的NULL或null不一样。4行的NULL或null为字符串
此时HDFS中如此存储
1 \N \N
2 \N \N
3
4 null NULL
5
此时
hive> select empid ,nvl(deptid,'E'),nvl(salary,'F') from employee;
1 \N \N
2 \N \N
3 E F
4 null NULL
5 E F
总结hive中null的定义的意义在于:oracle数据导出后原表中的null会变成'',然后导入到hive中也变成了''。但是hive中关于NULL的一些函数如nvl,coalesce和is null却无法使用,因为hive默认\N才代表NULL。在hive中通过
ALTER TABLE SET SERDEPROPERTIES('serialization.null.format' = '');修改''代表NULL,改造存储过程中就不需要改nvl等语句。
hive中的null的更多相关文章
- hive中的NULL(hive空值处理)
HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N, 这样造成浪费大量空间.而且用java.python直接进入 ...
- hive中的一种假NULL现象
使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢? 在hive中有一种假NULL,它看起 ...
- Hive中的一种假NULL
Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a string Time taken ...
- hive中grouping sets的使用
hive中grouping sets 数量较多时如何处理? 可以使用如下设置来 set hive.new.job.grouping.set.cardinality = 30; 这条设置的意义在于 ...
- Hive中自定义函数
Hive的自定义的函数的步骤: 1°.自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF 2°.需要实现evaluate函数,evaluate函数支持重 ...
- hive中sql解析出对应表和字段的调查
---恢复内容开始--- .阿里的druid中的sql parser有各种关系数据库sql的解析,但hive的不支持. druid初期的版本中是包含hive的,将以前版本中的hive dialect对 ...
- HIVE中IN的坑
问题:为什么HIVE中用了 NOT IN,结果集没了? 注:这个是原创,转载请注明,谢谢!直接进实验室>> > select * from a;OK1 a12 a23 a3Time ...
- hdfs数据到hive中,以及hdfs数据隐身理解
hdfs数据到hive中: 假设hdfs中已存在好了数据,路径是hdfs:/localhost:9000/user/user_w/hive_g2park/user_center_enterprise_ ...
- 061 hive中的三种join与数据倾斜
一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...
随机推荐
- JForum论坛安装以及部署(转)
链接地址:https://www.cnblogs.com/Amos-Turing/p/7151009.html 下载JForum2.1.9 包手动放到tomcat的webapps下面, 这次打开网址: ...
- java:(九大内置对象,计算服务器访问次数,filter过滤器,MVC框架,MVC和三层架构的关系)
1.九大内置对象: <%@ page language="java" import="java.util.*" pageEncoding="UT ...
- Flume采集日志
角色 Source 数据来源 (exec, kafka, http…)Channel 数据通道 (memory,file,jdbc)Sink 数据目的地 (kafka,hdfs,es…) Agent ...
- 项目中使token
项目中使token 如果项目架构采用前后端分离,并采用分布式架构,通过定义接口API,与前端进行数据交互,前端通过html前行实现.若加入移动端(Andriod,ios)实现,可直接使用API接口实现 ...
- 【Qt开发】Qt在QLabel(QWidget)鼠标绘制直线和矩形框
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/243546 说实话, ...
- PyQt5_主要的类库
1.PyQt5包括的主要模块如下. QtCore模块——涵盖了包的核心的非GUI功能,此模块被用于处理程序中涉及的时间.文件.目录.数据类型.文本流.链接.QMimeData.线程或进程等对象. Qt ...
- python-day17(正式学习)
目录 包 一.什么是包? 二.为什么要有包? 三.如何用包? 3.1 模块和包 3.2 扩展模块功能 3.3 修改__init__.py文件 绝对导入和相对导入 注意事项 模块不来总结了,直接去htt ...
- day 15 模块 相对导入
自定义模块: 什么是模块:本质就是.py文件,封装语句的最小单位. 自定义模块:实际上就是定义.py,其中可以包含:变量定义,可执行语句,for循环,函数定义等等,他们统称模块的成员. 模块的运行方式 ...
- 优雅的用两种方式爬网络 txt 文件【雾
TXT 文件?? (笑 这里爬的是 74xsw (咱好像也不怎么逛的网站)的英雄再临 ... 请注意这并不是教程,只是贴个代码仅供参考而已[雾 这里 用的 getTXT 的方式有两种,一种是每个章节分 ...
- Homebrew学习(六)之替换及重置homebrew、Homebred Core、Homebrew cask默认源
替换及重置homebrew默认源 中科大源 替换官方源: // 替换brew.git: cd "$(brew --repo)" git remote set-url origin ...