目录
- 1)表的关系
- 2)Hbase中创建表 test
- 3)视图映射
- 4)表映射
- 数字类型说明
1)表的关系
默认情况下, HBase 中已存在的表,通过 Phoenix 是不可见的。
如果要在 Phoenix 中操作 HBase 中已存在的表,可以在 Phoenix 中进行表的映射。
映射方式有两种:视图映射和表映射。
2)Hbase中创建表 test
启动 HBase Shell【首先确保hadoop、zk、hbase集群已经启动 】
bin/hbase shell
创建 HBase 表 test
create 'test','info1','info2'
3)视图映射
Phoenix 创建的视图是只读的,所以只能用来做查询,无法通过视图对数据进行修改等操作。
开启phoenix
/opt/module/phoenix/bin/sqlline.py hadoop100,hadoop101,hadoop102:2181
在 phoenix 中创建关联 test 表的视图
删除视图
drop view "test";
4)表映射
在 Pheonix 创建表去映射 HBase 中已经存在的表,是可以修改删除 HBase 中已经存在
的数据的。而且,删除 Phoenix 中的表,那么 HBase 中被映射的表也会被删除。
注:进行表映射时,不能使用列名编码,需将 column_encoded_bytes 设为 0。
数字类型说明
HBase 中的数字,底层存储为补码,而 Phoenix 中的数字,底层存储为在补码的基础上,
将符号位反转。
故当在 Phoenix 中建表去映射 HBase 中已存在的表,当 HBase 中有数字类型的字段时,
会出现解析错误的现象。
Hbase演示:
create 'test_number','info'
put 'test_number','1001','info:number',Bytes.toBytes(1000)
scan 'test_number',{COLUMNS => 'info:number:toLong'}
phoenix演示
create view "test_number"(id varchar primary key,"info"."number" bigint);
select * from "test_number";
drop view "test_number";
解决上述问题的方案有以下两种:
(1)Phoenix 种提供了 unsigned_int,unsigned_long 等无符号类型,其对数字的编码解
码方式和 HBase 是相同的,如果无需考虑负数,那在 Phoenix 中建表时采用无符号类型是
最合适的选择。
create view "test_number"(id varchar primary key,"info"."number" unsigned_long);
select * from "test_number";
如需考虑负数的情况,则可通过 Phoenix 自定义函数,将数字类型的最高位,即
符号位反转即可,
自定义函数可参考如下链接:https://phoenix.apache.org/udf.html