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的更多相关文章

  1. hive中的一种假NULL现象

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

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

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

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

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

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

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

  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. HDU2188 - 悼念512汶川大地震遇难同胞——选拔志愿者【巴什博弈】

    对于四川同胞遭受的灾难,全国人民纷纷伸出援助之手,几乎每个省市都派出了大量的救援人员,这其中包括抢险救灾的武警部队,治疗和防疫的医护人员,以及进行心理疏导的心理学专家.根据要求,我校也有一个奔赴灾区救 ...

  2. FFMpeg 常用命令格式转换,视频合成

    FFmpeg都是命令行的,用起来肯定不方便.但是,这对技术宅应该不成问题.下面,我就罗列一些比较实用的使用方法吧. FFmpeg的下载与安装 FFmpeg是开源的.但我们不必去下载它的源代码.下载已经 ...

  3. apache 与 nginx的区别

    Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apa ...

  4. C#中的string驻留池

    刚开始学习C#的时候,就听说CLR对于String类有一种特别的内存管理机制:有时候,明明声明了两个String类的对象,但是他们偏偏却指向同一个实例.如下: String s1 = "He ...

  5. 组件的使用(三)AutoCompleteTextView的使用

    AutoCompleteTextView经常使用的属性: android:completionHint 下拉列表以下的说明性文字 android:completionThreshold 弹出下来列表的 ...

  6. 一个简单的推断抢购时间是否到达的js函数

    原型函数,功能非常easy,找到时钟的id,计算数值.到达抢购时间时运行任务. function nwt() {var str=$('#deal_expiry_timer_e3cdcd2a').tex ...

  7. Line(扩展欧几里得)

    题意:本题给出一个直线,推断是否有整数点在这条直线上: 分析:本题最重要的是在给出的直线是不是平行于坐标轴,即A是不是为0或B是不是为0..此外.本题另一点就是C输入之后要取其相反数,才干进行扩展欧几 ...

  8. Blur 算法 (Unity 5.0 Shader)

    一:简单 Blur 算法 一个像素的颜色值由其邻近的若干像素和自己的颜色值的平均值重新定义,以此达到模糊的效果. 如下图,红色的像素点的值将由它和它周围的24个像素的平均值重新定义.计算的范围一般由一 ...

  9. POJ 2299 离散化线段树

    点击打开链接 Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 40827   Accepted ...

  10. linux下安装redis3.2

    这部分来自网络: http://blog.csdn.net/cuibruce/article/details/53501532 1.下载 下载地址:http://www.redis.io/downlo ...