• [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技术社区群

  • 相关阅读:
    定时器
    自定义个性化 EditPeople控件
    infopath 2010 调试.
    MOSS 查询
    网站项目建设流程概述
    跨站点显示列表数据 ListViewWebPart
    VIM记事——大小写转换
    事务码记录 程序优化常用st12
    SAP各模块字段与表的对应关系
    固定资产一览
  • 原文地址:https://www.cnblogs.com/hbase-community/p/8853577.html
Copyright © 2020-2023  润新知