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 ...
随机推荐
- 十八:jinja2之include标签
用于将页面的某一块地方抽取出来,要嵌入内容的时候使用,继承的概念 把具体内容分别放到其他地方同一管理,要用的时候使用include继承 使用include的时候可以直接使用接收的数据
- 简单的servlet上传文件
boolean multipartContent = ServletFileUpload.isMultipartContent(request);if (multipartContent==true) ...
- 【SSM】---增删改查
20:43:06 package com.chinasofti.dao; import java.util.List; import com.chinasofti.entity.User; publi ...
- beanFactory 设计模式 Bean 生命周期
写在前面的话 适用读者:有一定经验的,本文不适合初学者,因为可能不能理解我在说什么 文章思路:不会一开始就像别的博客文章那样,Bean 的生命周期,源码解读(给你贴一大堆的源码).个人觉得应该由问题驱 ...
- Pycharm最新激活码汇总,pycharm2019激活码
Pycharm激活码汇总 激活过程如下: 1.双击运行桌面上的Pycharm图标,进入下图界面,选择Do not import settings,之后选择OK,进入下一步. 2.拖动到底部,选择Acc ...
- kh67-wjs
个人简历 基本信息 姓 名: 性 别: 年 龄: 籍 贯: 联 ...
- TCP端口扫描
# TCP三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1 ...
- 微信小程序开发(一)----- 基础知识
1.什么是微信小程序 概念:小程序是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或者搜一下即可打开应用,体现了“用完即走”的理念,用户不需要关心是否安装太多应用的问题, ...
- 模板中用url_for的好处
from flask import Flask,render_template app = Flask(__name__) @app.route('/') def index(): return re ...
- excel常用公式--逻辑运算类
if: IF(logical_test, value_if_true, [value_if_false]). and: 逻辑判断,相当于“并”. or: 逻辑判断,相当于“或”.