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 ...
随机推荐
- 运行上次失败用例(--lf 和 --ff)
前言 “80%的bug集中在20%的模块,越是容易出现bug的模块,bug是越改越多“平常我们做手工测试的时候,比如用100个用例需要执行,其中10个用例失败了,当开发修复完bug后,我们一般是重点测 ...
- 彻底搞懂snowflake算法及百度美团的最佳实践
写在前面的话 一提到分布式ID自动生成方案,大家肯定都非常熟悉,并且立即能说出自家拿手的几种方案,确实,ID作为系统数据的重要标识,重要性不言而喻,而各种方案也是历经多代优化,请允许我用这个视角对分布 ...
- 点云ICP注册
原文链接 背景 两个点云要注册在一块,一般分两个步骤:先做一个大致的对齐,也就是所谓的初始注册,一般可以通过一些可靠的点对来计算得到(如图3所示):然后在初始注册的基础上进行精细注册,提升注册的精度( ...
- 《React+Redux前端开发实战》笔记3:基于Webpack构建的Hello World案例(下)
2.使用React编码 下面正式开始使用React来编写前端代码. (1)npm安装react和react-dom: npm install react react-dom -S (2)用下面代码替换 ...
- mybati代码生成器 mybatis-generator
Mybatis代码生成器,用于快速生成代码 代码 https://github.com/wangxinforme/mybatis-generator
- 洛谷 P1233 木棍加工 题解
题面 Dilworth定理:在数学理论中的序理论与组合数学中,Dilworth定理根据序列划分的最小数量的链描述了任何有限偏序集的宽度. 反链是一种偏序集,其任意两个元素不可比:而链则是一种任意两个元 ...
- ubuntu 个人常用命令
重启命令 : 1.reboot 2.shutdown -r now 立刻重启 3.shutdown -r 10 过10分钟自动重启 4.shutdown -r 20:35 ...
- MongoDB和Redis的区别
1).内存管理机制 a.Redis的数据全部存储在内存当中,会定期写入到磁盘当中,当内存不够用时, 可以选择指定的LRU(最近最少使用算法)的算法删除数据: b.MongoDB数据存在内存,有Linu ...
- scrapy架构图与执行流程
概览 本文描述了Scrapy的架构图.数据流动.以及个组件的相互作用 架构图与数据流 上图中各个数字与箭头代表数据的流动方向和流动顺序,具体执行流程如下: 0. Scrapy将会实例化一个Crawle ...
- Quartz.net 3.x使用总结(一)——简单使用
原文:Quartz.net 3.x使用总结(一)--简单使用 阅读目录 1.Quartz.net简介 2.简单使用 3.TriggerBuilder介绍 3.1 SimpleSchedule 3.2 ...