环境介绍
各组件已经安装完成状态下进行此操作。
先在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类型,这样插入的数据就不会发生变化。