一文教你搞懂hive中的NULL,null,\N,空

看了csdn上的都是各种抄袭,无话可说,看完之后似懂非懂。自己测试加总结一番。

注意这个只针对stored as textfile

create table cc_test.table_like(
    id int  ,
    name string
)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS TEXTFILE;

insert overwrite table cc_test.table_like
values
    (1,'cclovezbf','普通字符串cclovezbf'),
    (2,'\\N','字符串两个反斜杠一个N'),
    (3,'\N','字符串1个反斜杠一个N'),
    (4,'','空字符串'),
    (5,'NULL','字符串NULL'),
    (6,null,'真正的空');

 直接查看hdfs dfs -cat 文件大小为154字节,可以发现 2和6存储的name一模一样

 通过工具查看该表 发现2和6仍然一样

通过beeline客户端查看 发现 1 2 6 一样。

先说这个beeline客户端,这里的NULL大写字符串 为啥126都是一样呢?

因为这个只是一个linux的显示,他只能显示字符串,不管是你是字符串NULL还是真正的空,我总得显示一下吧?显示''空字符串,或者小写的null,或者大写的NULL,甚至字符串'空'。

他不像其他连接的工具通过颜色的深浅,你一下就知道哪个是字符串哪个是真正的空null

如何理解beeline这个很简单,--nullemptystring=false就用NULL代表空 --nullemptystring=true 就用''代表空

所以理解beline的很简单。

继续理解工具看到的null 就是2=\N 6=null (后面都用小null代表真正的空)

这两个为什么看的一样了

这是因为hdfs是以文件的形式记录text数据,那么总要用一个字符或者数据代表null吧,有人说 例如

1,2,3

1,,3

第二行,第二行的到底是什么呢?是字符串''还是null呢?所以hive直接就认定\N这个字符串就为空null。这个空null也可以用其他字符代替。比如我认为cclovezbf这个就是空null

alter table cc_test.table_like set  serdeproperties ( "serialization.null.format"="cclovezbf" );

这个就是说数据 用字符串cclovezbf代表空null

 

这里又有小伙伴会问 这个底层不是cclovezbf吗。为什么length(cclovezbf)=null呢?

本质就是数据是cclovezbf,但是给予我们看到的就是null,

如何查到真正的null数据呢 就是where name is null

网上说的这种方式我没成功。。。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值