Co2y's Blog

Phoenix和HBase关于null的区别

github streak竟然断了。。

不可冷漠

下面记录点知识

phoenix 和 hbase 关于 null 的区别

首先,HBase不像关系型表有固定的schema,HBase在建表时只需要初始化CF,至于这个CF中有哪些column是可以变的,并且HBase是不存储null的,当某一个cf:cq对应的值为null时,这个cq也就没有意义了,因此不存储,不占用空间,在HBase shell中查看也是看不到的。

但是Phoenix为了保证与RDBMS使用上的相似性,当把一张表从HBase映射到Phoenix中时,需要先在Phoenix中create table,这时表的schema是固定的,你得写全全部的字段名。这就造成了Phoenix和HBase的差异。

于是当从text通过importtsv导入某张表到HBase中时,开始时有些字段可以为空,并且在HBase中这些字段也会存在,只不过对应的value=后面是空的。当在Phoenix中人为执行一条upsert将某条记录的某个字段改成null时,这时这个字段在HBase中就消失了,但是在Phoenix中仍然可以看到。这就会带来错误。这也是为什么Phoenix在每个CF中会加一个_0来保证这个CF不会消失。

比如在Phoenix执行SQL时,where子句后面跟上某个字段的过滤条件,直觉上可能觉得无非是把这个字段当做null来处理,然而这个字段为空导致这个字段在HBase是不存在的,所以无论如何也查不到,即使做了对null的处理。