sqlline
或phoenix-sqlline
模式0: jdbc:phoenix:>!tables
0: jdbc:phoenix:> !desc SYSTEM.HBASE_TEST;
0: jdbc:phoenix:> !primarykeys SYSTEM.HBASE_TEST;
JDBC
模式select * from SYSTEM.CATALOG where TABLE_TYPE='u';
select * from SYSTEM.CATALOG where TABLE_NAME='HBASE_TEST';
Phoenix表是映射的hbase表, hbase存储的数据都是字节数组,因此,限制数据类型的只能是Phoenix自己。所以,我们就可以通过修改Phoenix元数据的方式修改表中字段的数据类型。
SYSTEM.CATALOG
SYSTEM.FUNCTION
SYSTEM.LOG
SYSTEM.SEQUENCE
SYSTEM.STATS
Phoenix的系统表有以上五张表, 其中SYSTEM.CATALOG表保存了我们新建表的元数据信息。
注:这种方法只能修改char、 varchar、 DECIMAL类型的长度、宽度等, 不能将varchar修改为integer类型。
create table test (
a integer not null primary key,
info.b varchar(2),
info.c varchar(5),
info.d decimal(4,2),
info.e decimal(6,3)
);
!desc test;
select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE,DECIMAL_DIGITS from SYSTEM.CATALOG where TABLE_NAME='TEST';
字段名称 | 含义 |
---|---|
TENANT_ID | 租户ID(这个不用管,所租户用的) |
TABLE_SCHEM | 表的schema |
TABLE_NAME | 表名 |
COLUMN_NAME | 列名 |
COLUMN_FAMIL | hbase底层的列族名 |
DATA_TYPE | 列的数据类型 |
COLUMN_SIZE | 列的数据长度(一般指char,varchar和decimal的长度) |
DECIMAL_DIGITS | decimal类型的小数长度 |
upsert into test values(1, '测试', '12345', 12.12, 123.123);
upsert into test values(2, '测试数据', '12345', 12.12, 123.123);
upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,COLUMN_SIZE) values('','','TEST','B','INFO',4);
select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE,DECIMAL_DIGITS from SYSTEM.CATALOG where TABLE_NAME='TEST';
再次查询,发现已修改成功。
upsert into test values(2, '测试数据', '12345', 12.12, 123.123);
发现仍未成功,此时需注意修改元数据后重启HBASE
,并登出phoenix-sqlline
HBASE
重启后phoenix-sqlline
重新登入