Phoenix表資料型別修改解析

2021-12-30 07:56:37 字數 2780 閱讀 8780

截止最新的phoenix-4.14.0, alter table 並沒有修改 現有表 現有字段 資料型別的功能, 因此, 想要實現修改資料型別的功能需要另闢蹊徑, 或者使用簡單粗暴的刪表建表, 但是生產上顯然這是不可取的.

phoenix表是對映的hbase表, hbase儲存的資料都是位元組陣列, 因此, 限制資料型別的只能是phoenix自己, 所以, 我們就可以通過修改phoenix元資料的方式修改表中字段的資料型別.

system.catalog

system.function

system.log

system.sequence

system.stats

phoenix的系統表有以上五張表, 其中system.catalog表儲存了我們新建表的元資料資訊.

插入資料正常顯示

upsert into test01 values(2, '123', '12345', 12.12, 123.123);報錯了: error: error 206 (22003): the data exceeds the max capacity for the data type. value='123' columnname=b (state=22003,code=206)

檢視sql:

注意: where 條件中的 表名test01 一定要大寫, 因為建表語句中的 表名, 欄位名等等只要不加引號, phoenix都會預設轉換為大寫儲存為元資料的.

顯示字段含義:

tenant_id

租戶id(這個不用管,所租戶用的)

table_schem

表的schema

table_name

表名 column_name

列名 column_famil

hbase底層的列族名

data_type

列的資料型別

column_size

列的資料長度(一般指char,varchar和decimal的長度)

decimal_digits

decimal型別的小數長度

b 的資料型別是 varchar(2), 而我們插入的是'123' , 明顯不夠, 所以我準備將其修改為 varchar(4)

修改sql:

upsert into system.catalog (tenant_id,table_schem,table_name,column_name,column_family,column_size) values('','','test01','b','0',4);注意:tenant_id,table_schem,table_name,column_name,column_family 是主鍵, 必須要有

再次檢視元資料可知, 已經修改好了.

還是報錯, 難道修改失敗了 別著急, 退出phoenix shell客戶端,重啟一下hbase, 再次進入phoenix, 就好了, 具體為什麼沒搞清楚, 猜測原因應該是system.catalog表的元資料載入到記憶體了, 有新的元資料時會追加載入新加的那部分, 但是不會更新原有的, 所以只能通過重啟hbase讓它重新載入system.catalog表的資料到記憶體.

切記: 重啟hbase!!!

上面是資料型別與名字的對照表, 用同樣的方法, upsert into的方式, 可以修改資料型別data_type , 資料長度column_size, 小數點長度decimal_digits等等.

oracle庫表修改資料型別

1 重新命名要修改的欄位名,如colname改為mycolname,alter table tablename rename column colname to mycolname 2 在表中新增乙個原欄位名字 colname並把型別定義為自己想改變的資料型別 這裡是date資料型別 alter t...

修改字段資料型別

我們假設相關表中沒有資料,使用sql語句修改字段型別的相關操作,以下就是具體方案的描述。如果表中沒有資料 直接這樣就可以了 alter table 表名 modify 欄位名 型別 eg alter table student id number 4 如果原表中存在data那麼方法就大不相同了,請看...

mysql 修改資料型別

mysql 修改資料型別 只修改列的資料型別的方法 通常可以寫成 alter table 表名 modify column 列名 新的列的型別 例如 student表中列sname的型別是char 20 現在要修改為varchar 20 sql語句如下 alter table student mod...