計劃總是趕不上變化,在實際開發中,需求總會不斷變更,比如需求開始只需要在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 | | |
+------------+--------------+------------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+----------+