[Phoenix] 八、動態列


摘要: 傳統關系型數據庫的動態列實現只能依賴邏輯層的設計實現,而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);

我們來查詢看一下

Screen_Shot_2018_04_08_at_09_24_20

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

Screen_Shot_2018_04_08_at_09_23_31

實際上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

查詢結果如下:
Screen_Shot_2018_04_08_at_10_09_46

三、總結

Phoneix的動態列功能是非SQL標准語法,它給我們帶來更多的靈活性,不再為靜態schema的字段擴展問題而困擾。然而我們在實際應用中,應該根據自己的業務需求決定是否真的使用動態列,因為動態列的濫用會大幅度的增加我們的維護成本。

四、References

轉自:https://yq.aliyun.com/articles/576440

 


交流

如果大家對HBase有興趣,致力於使用HBase解決實際的問題,歡迎加入Hbase技術社區群交流:

微信HBase技術社區群,假如微信群加不了,可以加秘書微信: SH_425 ,然后邀請您。

 

 

​  釘釘HBase技術社區群


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM