Hive中的一种假NULL
Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL。
例如如下这个查询:
hive> desc ljn004;
OK
a string
Time taken: 0.237 seconds
hive> select a from ljn004;
OK
NULL
Time taken: 46.232 seconds
看上去好像ljn004的a字段保存了一个 NULL,
但是换一个查询会发现它和NULL并不一样:
hive> select a from ljn004 where a is null;
OK
Time taken: 62.56 seconds
来看一下实际存储的是什么:
hive> select * from ljn004;
OK
\N
Time taken: 1.232 seconds
hive> select a from ljn004 where a = '\\N';
OK
NULL
Time taken: 72.933 seconds
ljn004的a字段实际存储的是一个'\N',a = '\\N'是因为Hive中'\'是转义字符,需要对'\'进行一次转义,所以变成'\\N'。
这种假NULL产生的原因实际上源于对表的错误操作。在Hive中,空值NULL在底层默认是用'\N'来存储的,看一个例子:
hive> create table ljn005 (col1 string);
OK
Time taken: 1.258 seconds
1 Rows loaded to ljn005
OK
Time taken: 63.727 seconds
hive> insert overwrite table ljn005 select NULL from dual;
然后看一下底层的数据存储:
$ hadoop fs -cat /group/hive/ljn005/attempt_201205041518_256192_m_000000_0
\N
可以看到底层数据将NULL存储成了'\N' 。
这样的设计存在一个问题是如果实际想存储'\N',那么实际查询出来的也是NULL而不是'\N' 。
Hive给出一种并非完美的解决方法就是可以自定义底层用什么字符来表示NULL。
例如我想用字符'a'来表示NULL:
hive> alter table ljn005 SET SERDEPROPERTIES('serialization.null.format' = 'a');
OK
Time taken: 0.175 seconds
hive> insert overwrite table ljn005 select NULL from dual;
1 Rows loaded to ljn005
OK
Time taken: 62.66 seconds
再看一下底层的存储:
$ hadoop fs -cat /group/hive/ljn005/attempt_201205041518_256764_m_000000_0
a
这时候底层的存储就变成了'a' ,今后插入到这张表中的'a'查询出来就变成了NULL而不是'a' 。
其实上面说的这个假NULL出现的原因就是在默认情况下(即用'\N'表示NULL),插入了NULL值,然后又用SET SERDEPROPERTIES语句修改了存储NULL的字符串。这时候表的属性修改了,但是底层存储的文件并没有修改。而'\N'显示为NULL在Hive中又是一个特例,于是就出现了这个假NULL,在开发过程中一定要注意!
原文地址:http://blog.sina.com.cn/s/blog_6ff05a2c010131sh.html
Hive中的一种假NULL的更多相关文章
- hive中的一种假NULL现象
使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢? 在hive中有一种假NULL,它看起 ...
- 061 hive中的三种join与数据倾斜
一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...
- Hive中的三种不同的数据导出方式介绍
问题导读:1.导出本地文件系统和hdfs文件系统区别是什么?2.带有local命令是指导出本地还是hdfs文件系统?3.hive中,使用的insert与传统数据库insert的区别是什么?4.导出数据 ...
- Hive 中的四种排序详解,再也不会混淆用法了
Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...
- 044 HIVE中的几种排序
1.order by:全局排序 select * from emp order by sal; 对于一个reduce才有用. 2.sort by:对于每个reduce进行排序 set mapreduc ...
- Hive中的4种Join方式
common join 普通join,性能较差,存在Shuffle map join 适用情况:大表join小表时,做不等值join 原理:将小表数据广播到各个节点,存储在内存中,在map阶段直接jo ...
- HIVE中的几种排序
1.order by:全局排序 select * from emp order by sal; 2.sort by:对于每个reduce进行排序 set mapreduce.job.reduces=3 ...
- Hive总结(八)Hive数据导出三种方式
今天我们再谈谈Hive中的三种不同的数据导出方式. 依据导出的地方不一样,将这些方式分为三种: (1).导出到本地文件系统. (2).导出到HDFS中: (3).导出到Hive的还有一个表中. 为了避 ...
- hive 数据导出三种方式
今天我们再谈谈Hive中的三种不同的数据导出方式.根据导出的地方不一样,将这些方式分为三种:(1).导出到本地文件系统:(2).导出到HDFS中:(3).导出到Hive的另一个表中.为了避免单纯的文字 ...
随机推荐
- css 垂直居中方法总结
工作中遇到垂直居中问题,特此总结了一下几种方式与大家分享.本文讨论的垂直居中仅支持IE8+ 1.使用绝对定位垂直居中 HTML <div class="container"& ...
- [POJ 3621] Sighting Cows
01分数规划的基本裸题. 因为路线一定是个环,所以找个最优比率生成环即可 二分一个比值,check一下即可. #include <queue> #include <cstdio> ...
- 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix
[链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...
- Python - 采用 contextmanage 简化代码
contextlib.contextmanage Python 2.7 documents: https://docs.python.org/2.7/library/contextlib.html?h ...
- 关于ajax异步请求不到数据的问题 302跨域请求
项目大致问题是这样的 在线咨询模块的数据是通过ajax异步加载来请求到数据,然后动态解析并且显示 前台页面的请求代码 后台action: 另外就是这个项目还有一个登陆权限的认证,如果不登录后台或者登录 ...
- 线程锁的机制Lock
java.util.concurrent.locks 接口Lock publci interface Lock Lock 实现提供了比使用synchronized方法和语句可获得的更加广泛的锁定操作, ...
- 机房工程-在线式、后备式UPS选择(转载)
原文网址:http://oa.yesky.com/10/31061510all.shtml#p31061510 1后备式UPS还是在线式UPS? 作为机房设备的一项重要保护措施,UPS起着无可替代的作 ...
- BA-楼宇自控系统设计论文(转载)潘翌庆 元晨
楼宇自控系统设计 潘翌庆 元晨 一.概述 楼宇自控系统(Building Automation System-BAS)是智能建筑中不可缺少的重要组成部分,在智能建筑中占有举足轻重的地位.它对建筑物内部 ...
- mongodb 学习笔记 07 -- 数据备份、恢复
mongoexport 导出json或者csv格式 mongoimport 导入json或者csv mongodump 导出二进制bson结构数据以及索引信息 mongorestore 导入二进制文件 ...
- Android适屏
总结一下自己的适屏经验,仅仅希望自己不断进步,不断完好,假设有热心肠的"前辈"指导一下,不胜感激! Android5.0已经出来了,说是这个版本号对Android屏幕适配做了非常多 ...