环境介绍
各组件已经安装完成状态下进行此操作。
先在HBase中建表,后在Phoenix建立同名表,分别使用HBase和Phoenix向表中插入数据,并查看是否正常。
HBase建表
-- HBase建表 create 'TEST','INFO' -- 插入数据 put 'TEST', 'ROW001','INFO:NUM','1000' put 'TEST', 'ROW002','INFO:NUM','10000.000000' -- 查看数据 scan 'TEST'
注意:表名、字段均为大写。
Phoenix建表
-- Phoenix建表 create table TEST( "ROW" varchar primary key, "INFO"."NUM" DECIMAL ); -- 插入数据 UPSERT INTO TEST("ROW","INFO"."NUM") VALUES ('123', 200000000); -- 查看数据 select * from TEST;
注意:表名、字段均为大写。
测试查询
HBase可以查询到Phoenix插入的数据,但是由于Phoenix建表的时候 INFO:NUM 字段采用的 DECIMAL 类型,Phoenix端插入的数据在HBase查询到是乱码。
hbase:005:0> scan 'TEST' ROW COLUMN+CELL 123 column=INFO:NUM, timestamp=2022-06-07T14:11:35.713, value=\xC5\x03 123 column=INFO:_0, timestamp=2022-06-07T14:11:35.713, value=x ROW001 column=INFO:NUM, timestamp=2022-06-07T14:06:11.539, value=1000 ROW001 column=INFO:_0, timestamp=2022-06-07T14:06:11.539, value= ROW002 column=INFO:NUM, timestamp=2022-06-07T14:06:13.490, value=10000.000000 ROW002 column=INFO:_0, timestamp=2022-06-07T14:06:13.490, value= 3 row(s) Took 0.0168 seconds hbase:006:0>
Phoenix可以查询到HBase插入的数据,但是但是由于Phoenix建表的时候 INFO:NUM 字段采用的 DECIMAL 类型,HBase端插入的数据在Phoenix端查询是科学计数法,并且数据精度异常。
0: jdbc:phoenix:> select * from TEST; +--------+------------------------------+ | ROW | NUM | +--------+------------------------------+ | 123 | 2E+8 | | ROW001 | -5.35353E+27 | | ROW002 | -5.353535355535353535353E+27 | +--------+------------------------------+ 3 rows selected (0.022 seconds)
最终结论
Phoenix对除Varchar类型外的其它类型支持都有点问题,DECIMAL 类型存储数据会出现科学计数法的现象。如果想让HBase和Phoenix的数据完全相同,可以将Phoenix的数据类型都改成Varchar类型,这样插入的数据就不会发生变化。