使用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. Atom 备份神器 —— Sync Settings

    当 Atom 的扩展越装越多,配置也越来越偏离了系统默认设置时,一旦电脑重装后需要复原开发环境,这将是一件比较头疼的事,但今天发现一个扩展,可以解决这一问题,那就是「Sync Settings」,根据 ...

  2. Code First :使用Entity. Framework编程(3) ----转发 收藏

    第三章 对属性使用约定和配置 在第2章,对Code First的约定以及如何通过配置覆写默认约定行为进行了大致的介绍.学习了如何使用Data Annotations进行配置,也学习了如何使用Fluen ...

  3. Vue-router中文教程-Vue-router参考手册.CHM

    下载地址http://download.csdn.net/detail/shouce_ren/9689243 百度云下载地址

  4. 如何订阅Form的自定义事件

    Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 .订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象.这个主体对象在自身状态变化时,会通知所 ...

  5. BeeFree - 在线轻松创建电子邮件消息

    Beefree 可以很容易地创建一个电子邮件消息,可以被用来发送企业简讯,宣布一个新产品,促进销售等.可以免费使用,您甚至不需要创建任何类型的帐户.您可以使用 Beefree 创建创新的,易于使用的电 ...

  6. Plyr – 简单,灵活的 HTML5 媒体播放器

    Plyr 是一个简单的 HTML5 媒体播放器,包含自定义的控制选项和 WebVTT 字幕.它是只支持现代浏览器,轻量,方便和可定制的媒体播放器.还有的标题和屏幕阅读器的全面支持. 在线演示      ...

  7. [deviceone开发]-购物车的简单示例

    一.简介 主要是演示listview所在的ui和模板cell所在的ui之间数据的交互,点击一行,可以通过加减数量,自动把所有选中的汽车价格显示在底部. 二.效果图 三.示例地址: http://sou ...

  8. vue安装

     条件:已安装 node&npm 1.安装 cnpm :                      $ npm install -g cnpm --registry=https://regis ...

  9. js中如何获取纯正的undefined?

    1.为什么要获取undefined? 因为undefined在javascript中不是保留字,可以被用户当做变量来赋值,这样如果我们后期需要用到undefined来检测一个变量的话,那么检测的值就不 ...

  10. linux heartbeat v2/v3 的一点资料

    http://linux-ha.org http://linux-ha.org/wiki/Pacemaker Heartbeat2 http://blog.taggesell.de/index.php ...