摘要: 傳統關系型數據庫的動態列實現只能依賴邏輯層的設計實現,而Phoenix是HBase上的SQL層,借助HBase特性實現的動態列功能,具有高度的靈活性,告別業務邏輯層的復雜設計。
一、概要
動態列是指在查詢中新增字段,操作創建表時未指定的列。傳統關系型數據要實現動態列目前常用的方法有:設計表結構時預留新增字段位置、設計更通用的字段、列映射為行和利用json/xml存儲字段擴展字段信息等,這些方法多少都存在一些缺陷,動態列的實現只能依賴邏輯層的設計實現。由於Phoenix是HBase上的SQL層,借助HBase特性實現的動態列,避免了傳統關系型數據庫動態列實現存在的問題。
二、動態列使用
示例表(用於語法說明)
CREATE TABLE EventLog ( eventId BIGINT NOT NULL, eventTime TIME NOT NULL, eventType CHAR(3) CONSTRAINT pk PRIMARY KEY (eventId, eventTime)) COLUMN_ENCODED_BYTES=0
1. Upsert
在插入數據時指定新增列字段名和類型,並在values對應的位置設置相應的值。語法如下:
upsert into <tableName>
(exists_col1, exists_col2, ... (new_col1 time, new_col2 integer, ...)) VALUES (v1, v2, ... (v1, v2, ...))
動態列寫入示例:
UPSERT INTO EventLog (eventId, eventTime, eventType, lastGCTime TIME, usedMemory BIGINT, maxMemory BIGINT) VALUES(1, CURRENT_TIME(), 'abc', CURRENT_TIME(), 512, 1024);
我們來查詢看一下

查詢發現並沒新增列的數據,也就是通過動態列插入值時並沒有對表的schema直接改變。HBase表中發生了怎么樣的變化呢?

實際上HBase表中已經新增列以及數據。那通過動態列添加的數據怎么查詢呢?
2. Select
動態列查詢語法
select [*|table.*|[table.]colum_name_1[AS alias1][,[table.]colum_name_2[AS alias2] …], <dy_colum_name_1>] FROM tableName (<dy_colum_name_1, type> [,<dy_column_name_2, type> ...]) [where clause] [group by clause] [having clause] [order by clause]
動態列查詢示例
SELECT eventId, eventTime, lastGCTime, usedMemory, maxMemory FROM EventLog(lastGCTime TIME, usedMemory BIGINT, maxMemory BIGINT) where eventId=1
查詢結果如下:
三、總結
Phoneix的動態列功能是非SQL標准語法,它給我們帶來更多的靈活性,不再為靜態schema的字段擴展問題而困擾。然而我們在實際應用中,應該根據自己的業務需求決定是否真的使用動態列,因為動態列的濫用會大幅度的增加我們的維護成本。
四、References
轉自:https://yq.aliyun.com/articles/576440
交流
如果大家對HBase有興趣,致力於使用HBase解決實際的問題,歡迎加入Hbase技術社區群交流:
微信HBase技術社區群,假如微信群加不了,可以加秘書微信: SH_425 ,然后邀請您。
釘釘HBase技術社區群

