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;

在這裏插入圖片描述

添加字段

alter table test01_20200413 add col6 bigint;

在這裏插入圖片描述

將新增的字段數據補齊

通過主鍵補齊新增字段數據

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;

在這裏插入圖片描述
在這裏插入圖片描述

刪除字段

alter table test01_20200413 drop column col6;

在這裏插入圖片描述

查看元數據

注意:表名必須要大寫,因爲元數據中保存的是大寫,並且區分大小寫

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';

在這裏插入圖片描述

字段名稱 字段含義
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

在這裏插入圖片描述

修改元數據

將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 shell客戶端,,再次進入Phoenix,就好了,因爲我修改了phoenix元數據更新時間爲一天,需要退出客戶端重新進一下,重新加載元數據,然後就好了,如果沒手動修改, 默認是always,每個sql都會更新元數據,應該不會有這個問題。
如果重新進入phoenix還是不行,那就需要重啓hbase了,具體原因我也沒搞懂,有時候需要重啓hbase,有時候不重啓也會生效。
在這裏插入圖片描述

舉一反三

上面是數據類型與名字的對照表,用同樣的方法,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         |          |          |
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章