看了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
网上说的这种方式我没成功。。。
----------------------------------------------------------------------------------------------------------------------