使用hive时,我们偶尔会遇到这样的问题,当你将结果输出到屏幕时,查出的数据往往显示为null,但是当你将结果输出到文本时,却显示为空(即未填充),这是为什么呢?

在hive中有一种假NULL,它看起来和NULL一样,但是实际却不是NULL。

比如下面这样:

[hdfs@dsdc04 ~]$ cat /data6/chenye/baidu_djzs_sessionid/test
\N
NULL

Kris
null

本地的test文件内有五行数据,分别为\N、NULL、   、Kris、null

我们建表将它传到hdfs上,之后再在hive中进行查询,结果如下:

hive> select * from basedatadb.testnull;
OK
NULL
NULL

Kris
null
Time taken: 0.748 seconds, Fetched: 5 row(s)

看清楚了没?发生了什么?在hive中查询时,也显示为五行数据,但是它们分别为NULL、NULL、  、Kris、null。为什么原始数据中的\N在hive中变成了NULL?

再看看,我们本次将结果输出到文本时的情况:

hive> insert overwrite local directory '/data/testnull'
> row format delimited fields terminated by ','
> select *
> from basedatadb.testnull;
Query ID = hdfs_20151020105050_650b3be9-e1af-4236-af4d-71283fb2642b
Total jobs = 1
Launching Job 1 out of 1

Status: Running (Executing on YARN cluster with App id application_1441787030155_0736)

--------------------------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
--------------------------------------------------------------------------------
Map 1 .......... SUCCEEDED 1 1 0 0 0 0
--------------------------------------------------------------------------------
VERTICES: 01/01 [==========================>>] 100% ELAPSED TIME: 6.39 s
--------------------------------------------------------------------------------
Copying data to local directory /data/testnull
Copying data to local directory /data/testnull
OK
Time taken: 10.633 seconds

------------

打开这个结果显示:

[hdfs@dsdc04 ~]$ cat /data/testnull/*
\N
NULL

Kris
null

也显示为五行,分别为\N、NULL、   、Kris、null。

这种假NULL产生的原因是因为在hive中,空值NULL在底层默认是用'\N'来存储的。

这样的设计存在一个问题是如果实际想存储'\N',那么实际查询出来的也是NULL而不是'\N' 。
Hive给出一种并非完美的解决方法就是可以自定义底层用什么字符来表示NULL。
例如我想用字符'Kris'来表示NULL:

hive> alter table basedatadb.testnull set SERDEPROPERTIES('serialization.null.format' = 'Kris');
OK
Time taken: 0.303 seconds
hive> select * from basedatadb.testnull;
OK
\N
NULL

NULL
null
Time taken: 0.131 seconds, Fetched: 5 row(s)
hive>

看到没有,我们将本张表的空值标识设定为“Kris”后,原本的\N正常显示为\N,原本的Kris显示为NULL。
今后插入到这张表中的'Kris'查询出来就变成了NULL而不是'Kris' 。因为我这个版本的hive还不支持插入操作,所以此处不实验。

然后我又很好奇我们把结果输出到文本会是什么情况,于是我又开启了相关实验,发现:

hive> insert overwrite local directory '/data/testnull2'
> row format delimited fields terminated by ','
> select *
> from basedatadb.testnull;
Query ID = hdfs_20151020113333_9bcd875a-64d7-4494-98d5-aca2af76be3a
Total jobs = 1
Launching Job 1 out of 1

Status: Running (Executing on YARN cluster with App id application_1441787030155_0739)

--------------------------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
--------------------------------------------------------------------------------
Map 1 .......... SUCCEEDED 1 1 0 0 0 0
--------------------------------------------------------------------------------
VERTICES: 01/01 [==========================>>] 100% ELAPSED TIME: 6.15 s
--------------------------------------------------------------------------------
Copying data to local directory /data/testnull2
Copying data to local directory /data/testnull2
OK
Time taken: 10.921 seconds
hive> Shutting down tez session.
[hdfs@dsdc04 ~]$ cat ^C
[hdfs@dsdc04 ~]$ cat /data/testnull2/*
\N
NULL

\N
null

当我把表的SET SERDEPROPERTIES属性更改为'Kris'后,当我将查询结果输出到文本时,Kris也显示为\N。

结论:
其实上面说的这个假NULL出现的原因就是在默认情况下,即用'\N'表示NULL。可以用SET SERDEPROPERTIES语句修改表的属性,可将其他字段设置为默认的空值的表示。但是值得注意的是:底层存储的文件并没有被修改,经过hive查询和计算的文件却修改了。而'\N'显示为NULL在Hive中又是一个特例,于是就出现了这个假NULL,在开发及分析过程中一定要注意!

以上资源来源于:http://blog.sina.com.cn/s/blog_6ff05a2c010131sh.html

hive中的一种假NULL现象的更多相关文章

  1. Hive中的一种假NULL

    Hive中有种假NULL,它看起来和NULL一摸一样,但是实际却不是NULL. 例如如下这个查询: hive> desc ljn004; OK a       string Time taken ...

  2. 061 hive中的三种join与数据倾斜

    一:hive中的三种join 1.map join 应用场景:小表join大表 一:设置mapjoin的方式: )如果有一张表是小表,小表将自动执行map join. 默认是true. <pro ...

  3. Hive 中的四种排序详解,再也不会混淆用法了

    Hive 中的四种排序 排序操作是一个比较常见的操作,尤其是在数据分析的时候,我们往往需要对数据进行排序,hive 中和排序相关的有四个关键字,今天我们就看一下,它们都是什么作用. 数据准备 下面我们 ...

  4. Hive中的三种不同的数据导出方式介绍

    问题导读:1.导出本地文件系统和hdfs文件系统区别是什么?2.带有local命令是指导出本地还是hdfs文件系统?3.hive中,使用的insert与传统数据库insert的区别是什么?4.导出数据 ...

  5. 044 HIVE中的几种排序

    1.order by:全局排序 select * from emp order by sal; 对于一个reduce才有用. 2.sort by:对于每个reduce进行排序 set mapreduc ...

  6. Hive中的4种Join方式

    common join 普通join,性能较差,存在Shuffle map join 适用情况:大表join小表时,做不等值join 原理:将小表数据广播到各个节点,存储在内存中,在map阶段直接jo ...

  7. HIVE中的几种排序

    1.order by:全局排序 select * from emp order by sal; 2.sort by:对于每个reduce进行排序 set mapreduce.job.reduces=3 ...

  8. Hive总结(八)Hive数据导出三种方式

    今天我们再谈谈Hive中的三种不同的数据导出方式. 依据导出的地方不一样,将这些方式分为三种: (1).导出到本地文件系统. (2).导出到HDFS中: (3).导出到Hive的还有一个表中. 为了避 ...

  9. hive 数据导出三种方式

    今天我们再谈谈Hive中的三种不同的数据导出方式.根据导出的地方不一样,将这些方式分为三种:(1).导出到本地文件系统:(2).导出到HDFS中:(3).导出到Hive的另一个表中.为了避免单纯的文字 ...

随机推荐

  1. JavaScript寄生组合式继承分析

    JavaScript寄生组合式继承特点: 避免了在子类prototype上创建不必要多余的属性,相比直接继承基类的实例效率要高. 是JavaScript 实现继承的最有效方式. <script& ...

  2. 调用MyFocus库,简单实现二十几种轮播效果

    一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要 ...

  3. swift学习笔记之-扩展(Extensions)

    //扩展(Extensions) import UIKit /*扩展(Extensions):扩展 就是为一个已有的类.结构体.枚举类型或者协议类型添加新功能.这包括在没有权限获取原始源代码的情况下扩 ...

  4. HtmlAgilityPack---Html解析框架

    如果你想从一段HTML中提取出指定的标记(如:获取所有的div.获取具有指定属性的元素)如果你想编辑一段HTML,修改里面的部分元素如果你想判断一段HTML中指定元素的关系(子节点.父节点.兄弟节点. ...

  5. Eclipse开发STM32出现找不到函数的情况的解决方法

    问题表现: 在明明引用了头文件的情况下,出现“undefined reference to  `…'”的情况,例如下图: 解决方法: 在左边的数据目录定位到“system\src\stm32f0-st ...

  6. Troubleshooting FIM: (No Display Name) in FIM Portal

    from: http://social.technet.microsoft.com/wiki/contents/articles/12682.troubleshooting-fim-no-displa ...

  7. Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信

    以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...

  8. AFNetworking二次封装的那些事

    AFNetworking可是iOS网络开发的神器,大大简便了操作.不过网络可是重中之重,不能只会用AFNetworking.我觉得网络开发首先要懂基本的理论,例如tcp/ip,http协议,之后要了解 ...

  9. [转 载] android 谷歌 新控件(约束控件 )ConstraintLayout 扁平化布局

    序 在Google IO大会中不仅仅带来了Android Studio 2.2预览版,同时带给我们一个依赖约束的库. 简单来说,她是相对布局的升级版本,但是区别与相对布局更加强调约束.何为约束,即控件 ...

  10. iOS-H5学习篇-01

    什么是HTML? HTML 是用来描述网页的一种语言. 0.HTML 指的是超文本标记语言 1.HTML 不是一种编程语言,而是一种标记语言 2.标记语言是一套标记标签 3.HTML 使用标记标签来描 ...