phoenix表结构修改(新增字段,字段类型修改)

文章目录

  • 修改思路
  • 开始操作
    • 创建模拟表
    • 插入数据
    • 添加字段
    • 将新增的字段数据补齐
    • 删除字段
    • 查看元数据
    • 查看表的主键
    • 修改元数据
    • 举一反三
    • 查看表信息


计划总是赶不上变化,在实际开发中,需求总会不断变更,比如需求开始只需要在phoenix中创建5个字段就可以,但随着业务的变化,需要新增一个字段,某个字段的数据类型也需要改变,这时简单粗暴的方式就是删表重建,再重跑数据。是否可以在phoenix中修改字段类型和添加字段呢?下面就来测试下:

修改思路

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 test01_20200413 (
col1 integer not null primary key,
col2 varchar(2),
col3 varchar(5),
col4 decimal(4,2),
col5 decimal(6,3)
);

插入数据

插入数据时必须要有主键

upsert into test01_20200413 (COL1, COL2, COL3, COL4, COL5) values(1, '12', '12345', 12.12, 123.123);

select * from test01_20200413 t limit 2;

phoenix表结构修改(新增字段,字段类型修改)_第1张图片

添加字段

alter table test01_20200413 add col6 bigint;

phoenix表结构修改(新增字段,字段类型修改)_第2张图片

将新增的字段数据补齐

通过主键补齐新增字段数据

upsert into test01_20200413 (COL1, COL6) values(1, 321334);

--如果其他字段有新增需要更,加上更新字段和值就行
upsert into test01_20200413 (COL1, COL2, COL6) values(1, '13', 321334);

select * from test01_20200413 t where col1 = 1 limit 2;

phoenix表结构修改(新增字段,字段类型修改)_第3张图片
phoenix表结构修改(新增字段,字段类型修改)_第4张图片

删除字段

alter table test01_20200413 drop column col6;

phoenix表结构修改(新增字段,字段类型修改)_第5张图片

查看元数据

注意:表名必须要大写,因为元数据中保存的是大写,并且区分大小写

select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE,DECIMAL_DIGITS from SYSTEM.CATALOG where TABLE_NAME='TEST01_20200413';

phoenix表结构修改(新增字段,字段类型修改)_第6张图片

字段名称 字段含义
TENANT_ID 租户ID(这个不用管,所租户用的)
TABLE_SCHEM 表的schema
TABLE_NAME 表名
COLUMN_NAME 列名
COLUMN_FAMIL hbase底层的列族名
DATA_TYPE 列的数据类型
COLUMN_SIZE 列的数据长度(一般指char,varchar和decimal的长度)
DECIMAL_DIGITS decimal类型的小数长度

查看表的主键

--!primarykeys 表名
!primarykeys SYSTEM.CATALOG

phoenix表结构修改(新增字段,字段类型修改)_第7张图片

修改元数据

将col2的字段类型由varchar(2) 改为varchar(4),
注意: 表名和字段必须为大写,不然无效
TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY 是主键, 必须要有

upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,COLUMN_SIZE) values('','','TEST01_20200413','COL2','0',4);

phoenix表结构修改(新增字段,字段类型修改)_第8张图片

还是报错, 难道修改失败了???别着急, 退出Phoenix shell客户端,,再次进入Phoenix,就好了,因为我修改了phoenix元数据更新时间为一天,需要退出客户端重新进一下,重新加载元数据,然后就好了,如果没手动修改, 默认是always,每个sql都会更新元数据,应该不会有这个问题。
如果重新进入phoenix还是不行,那就需要重启hbase了,具体原因我也没搞懂,有时候需要重启hbase,有时候不重启也会生效。
phoenix表结构修改(新增字段,字段类型修改)_第9张图片

举一反三

上面是数据类型与名字的对照表,用同样的方法,upsert into的方式,可以修改数据类型DATA_TYPE,数据长度COLUMN_SIZE,小数点长度DECIMAL_DIGITS等等。

例如将COL2的数据类型由varchar(4)改为integer

upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE) values('','','TEST01_20200413','COL2','0',4);

!describe TEST01_20200413
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+
| TABLE_CAT  | TABLE_SCHEM  |    TABLE_NAME    | COLUMN_NAME  | DATA_TYPE  | TYPE_NAME  | COLUMN_SIZE  | BUFFER_LENGTH  | DECIMAL_DIGITS  | NUM_PREC_RADIX  | NULLABLE  | REMARKS  | COLUMN_D |
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+
|            |              | TEST01_20200413  | COL1         | 4          | INTEGER    | null         | null           | null            | null            | 0         |          |          |
|            |              | TEST01_20200413  | COL2         | 4          | INTEGER    | 4            | null           | null            | null            | 1         |          |          |
|            |              | TEST01_20200413  | COL3         | 12         | VARCHAR    | 5            | null           | null            | null            | 1         |          |          |
|            |              | TEST01_20200413  | COL4         | 3          | DECIMAL    | 4            | null           | 2               | null            | 1         |          |          |
|            |              | TEST01_20200413  | COL5         | 3          | DECIMAL    | 6            | null           | 3               | null            | 1         |          |          |
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+

查看表信息

--!describe 表名
!describe TEST01_20200413

0: jdbc:phoenix:fuyun> !describe TEST01_20200413
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+
| TABLE_CAT  | TABLE_SCHEM  |    TABLE_NAME    | COLUMN_NAME  | DATA_TYPE  | TYPE_NAME  | COLUMN_SIZE  | BUFFER_LENGTH  | DECIMAL_DIGITS  | NUM_PREC_RADIX  | NULLABLE  | REMARKS  | COLUMN_D |
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+
|            |              | TEST01_20200413  | COL1         | 4          | INTEGER    | null         | null           | null            | null            | 0         |          |          |
|            |              | TEST01_20200413  | COL2         | 12         | VARCHAR    | 2            | null           | null            | null            | 1         |          |          |
|            |              | TEST01_20200413  | COL3         | 12         | VARCHAR    | 5            | null           | null            | null            | 1         |          |          |
|            |              | TEST01_20200413  | COL4         | 3          | DECIMAL    | 4            | null           | 2               | null            | 1         |          |          |
|            |              | TEST01_20200413  | COL5         | 3          | DECIMAL    | 6            | null           | 3               | null            | 1         |          |          |
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+

你可能感兴趣的:(phoenix)