phoenix映射HBase
默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的。
如果要在phoenix中操作由hbase创建的表,则需要在phoenix中进行表的映射。
映射方式有两种:
视图映射和表映射
为了测试,我们先在Hbase中创建表test
test有两个列簇name、company.
视图映射
Phoenix创建的视图是【只读】的,所以只能用来做查询,无法通过视图对源数据进行修改等操作。
在phoenix中创建视图test表
0: jdbc::phoenix:mini1,mini2,mini3:2181> create view “test”(empid varchar primary key,“name”.“firstname” varchar,“name”.“lastname” varchar,“company”.“name” varchar,“company”.“address” varchar);
当我想在这个视图插入数据时报错了:Table is read only
然后我在Hbase加入一条数据:
能在Phoenix查到
删除视图 drop view “test”;
表映射
使用Apache Phoenix创建对HBase的表映射,有两种方法:
1) 当HBase中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view改为create table即可。
create table "test"(empid varchar primary key,"name"."firstname" varchar,
"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);
2) 当HBase中不存在表时,可以直接使用create table指令创建需要的表,系统将会自动在Phoenix和HBase中创建person_infomation的表,并会根据指令内的参数对表结构进行初始化。
create table "person_infomation"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,
"company"."name" varchar,"company"."address" varchar) column_encoded_bytes=0;
这时候通过Phoenix就能进行新增和修改操作了
这里对视图和表进行一个比较发现
通过Phoenix表映射添加的数据会有多余的空行
这一行看似没用,其实是为了提升查询效率的
总结:
- 视图只读,不支持新增和修改
- 如果删除视图,源数据不会发生改变
- 视图的查询效率较低(原因是:表映射会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率,而视图映射没有)
相比之下
- 使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。