Dynamic Columns

动态列是指在查询中新增字段,操作创建表时未指定的列。传统关系型数据要实现动态列目前常用的方法有:设计表结构时预留新增字段位置、设计更通用的字段、列映射为行和利用 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

动态列写入

UPSERT INTO EventLog (eventId, eventTime, eventType, lastGCTime TIME, usedMemory BIGINT, maxMemory BIGINT)
 VALUES(1, CURRENT_TIME(), 'abc', CURRENT_TIME(), 512, 1024);

动态列查询

SELECT eventId, eventTime, lastGCTime, usedMemory, maxMemory 
FROM EventLog(lastGCTime TIME, usedMemory BIGINT, maxMemory BIGINT) 
WHERE eventId=1

Phoneix 的动态列功能是非 SQL 标准语法,它给我们带来更多的灵活性,不再为静态 schema 的字段扩展问题而困扰。然而我们在实际应用中,应该根据自己的业务需求决定是否真的使用动态列,因为动态列的滥用会大幅度的增加我们的维护成本。