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

例如如下这个查询:

hive> desc ljn004;

OK

a      string

Timetaken: 0.237 seconds

hive> select a fromljn004;

OK

NULL

Timetaken: 46.232 seconds

看上去好像ljn004的a字段保存了一个 NULL,

但是换一个查询会发现它和NULL并不一样:

hive> select a from ljn004 where a isnull;

OK

Timetaken: 62.56 seconds

来看一下实际存储的是什么:

hive> select * fromljn004;

OK

\N

Timetaken: 1.232 seconds

hive> select a from ljn004 where a ='\\N';

OK

NULL

Timetaken: 72.933 seconds

ljn004的a字段实际存储的是一个'\N',a ='\\N'是因为Hive中'\'是转义字符,需要对'\'进行一次转义,所以变成'\\N'。

这种假NULL产生的原因实际上源于对表的错误操作。在Hive中,空值NULL在底层默认是用'\N'来存储的,看一个例子:

hive> create table ljn005 (col1string);

OK

Timetaken: 1.258 seconds

1 Rowsloaded to ljn005

OK

Timetaken: 63.727 seconds

hive> insert overwrite table ljn005 selectNULL 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 SETSERDEPROPERTIES('serialization.null.format' ='a');

OK

Timetaken: 0.175 seconds

hive> insert overwrite table ljn005 selectNULL from dual;

1 Rowsloaded to ljn005

OK

Timetaken: 62.66 seconds

再看一下底层的存储:

$hadoop fs -cat/group/hive/ljn005/attempt_201205041518_256764_m_000000_0

a

这时候底层的存储就变成了'a' ,今后插入到这张表中的'a'查询出来就变成了NULL而不是'a' 。

其实上面说的这个假NULL出现的原因就是在默认情况下(即用'\N'表示NULL),插入了NULL值,然后又用SETSERDEPROPERTIES语句修改了存储NULL的字符串。这时候表的属性修改了,但是底层存储的文件并没有修改。而'\N'显示为NULL在Hive中又是一个特例,于是就出现了这个假NULL,在开发过程中一定要注意!

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中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

    在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...

  4. Hive中的四种排序

    一.Order by order by会对输入的数据做全局排序,因此只有一个reducer,多个reducer无法保证全局有序.只有一个reducer的弊端在于当输入的数据量较大时,需要较长的计算时间 ...

  5. Hive中的几种排序方式

    Order By Order By 会对输入做全局的排序,所以只会有一个reduce,这样的话在大量数据面前查询效率较低,费时较长 select * from salary order by sala ...

  6. hive中NULL值问题

    问题描述 源端数据oracle数据库,通过cdm迁移工具将数据迁移到目标端hive.在oracle中的NULL值迁移到hive中后有的字段表现为NULL,有的字段表现为空串""(即 ...

  7. 谈笑间学会大数据-Hive中的排序

    你可以不够优秀,但是不要甘于平凡.-- 阿尼古 Hive中的四种排序 order by . sort by . distribute by .cluster by 首先贴一下官网对于Hive排序的几种 ...

  8. hive中使用iceberg表格式时锁表总结

    1. 原因 写入iceberg表时,会在hive_locks表中插入一条记录,表示该表正在被写入(hive中的独占锁) 当数据插入完成后,会自动删除该条记录. 2. 出现场景 (1)在同时往同一个ic ...

  9. 详解:Hive中的NULL的处理、优点、使用情况(注意)

    Hive中的NULL的处理.优点.使用情况 一:Hive中的NULL hive的使用中不可避免的需要对null.''(空字符串)进行判断识别.但是hive又别于传统的数据库. 1.不同数据类型对空值的 ...

最新文章

  1. Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
  2. Node.js 指南(Docker化Node.js Web应用程序)
  3. Selenium+phanmJs 操作浏览器 爬取数据
  4. python dataframe是什么_python – 逐个构建DataFrame的最快方法是什么?
  5. python杨辉三角函数公式大全_python-1-杨辉三角算法总结
  6. htmlunit爬取js异步加载后的页面
  7. SQL重复记录处理(查找,过滤,删除)
  8. Eigen 3.3.7 MatrixVector的运算
  9. vue分享卡住_vue init webpack卡住无反应??
  10. Oracle可视化工具plsqldev8.0安装详细步骤
  11. 【音视频数据数据处理 6】【RGB篇】将RGB24图片转为YUV420格式图片
  12. 简易智能自动问答机器人
  13. python发送文件到指定的邮箱_python笔记:批量将指定附件发送到指定邮箱地址
  14. ip rule 路由策略数据库管理命令
  15. 哔哩哔哩轻视频怎么去水印
  16. 深度学习,提高分类精度
  17. 姚期智是计算机领域的科学家吗,他是顶级计算机专家,清华最受欢迎教授,在国际上与杨振宁齐名...
  18. c++面向对象的学生管理系统
  19. “专利费用减缓”怎么申请?
  20. 安卓android studio传感器编程入门demo读懂就通1分钟跑通掌握最多需要三十分钟

热门文章

  1. linux该专接本还是工作_是该专接本还是直接工作?学历和经验哪个重要?
  2. 一文搞定Linux shell脚本编程( 史上最全汇总 )
  3. qt中实现息屏开平mousepress_QT信号槽分析
  4. python 下载文件 登录信息-Python爬虫 登录网页后下载图片,怎么保持登录状态?...
  5. 编写java程序的三步骤_帮助Java小白涨知识的教程(三)(运行HelloWorld程序)
  6. c++ python opencv_ubuntu下C++与Python混编,opencv中mat类转换
  7. python某行某列读取数据_使用scrpython从某行的第一列提取数据
  8. python画同心圆程序_python – matplotlib:如何在给定的半径范围内绘制同心圆
  9. limux php启动_linux下nginx与php设置开机启动代码
  10. php redis 扩展 编译安装,Linux 下 PHP 扩展 redis 编译安装