[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

目录
相关文章
|
人工智能 C++
ML之FE:Vintage曲线/Vintage分析的简介、计算逻辑、案例应用之详细攻略
ML之FE:Vintage曲线/Vintage分析的简介、计算逻辑、案例应用之详细攻略
ML之FE:Vintage曲线/Vintage分析的简介、计算逻辑、案例应用之详细攻略
|
消息中间件 NoSQL JavaScript
阿里官方 Redis 开发规范
阿里官方 Redis 开发规范
|
Java 定位技术 API
标准坐标系与火星坐标系(高德)百度坐标系之间互转
这里先给大家介绍几个坐标系: 1.WGS84:国际坐标系,为一种大地坐标系,也是目前广泛使用的GPS全球卫星定位系统使用的坐标系。2.GCJ02:火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。
5258 0
conda常用操作和配置镜像源
conda常用操作和配置镜像源
35827 0
|
7月前
|
人工智能 JavaScript 调度
一文看懂:Hermes Agent与OpenClaw区别对比,AI Agent双雄对决,谁才是2026最佳选择
Hermes Agent是轻量Python智能体,主打“自进化+持久记忆”,越用越懂你;OpenClaw是TypeScript控制中枢,强在多通道、多智能体编排与成熟插件生态。免费领阿里云Tokens:https://t.aliyun.com/U/fPVHqY 选Hermes重深度成长,选OpenClaw重广度调度。
2797 1
|
SQL 分布式计算 大数据
一张图,详解大数据技术架构
一张图,详解大数据技术架构
|
人工智能 JSON 运维
Dataphin MCP:让数据查询 “轻而易举”
Dataphin推出MCP服务,助力Agent高效获取数据,释放企业数据价值。
1252 10
|
人工智能 JSON 自然语言处理
让数据查询又快又准,瓴羊Dataphin MCP保姆级教程来啦!
在AI Agent快速发展的背景下,优质数据资产成为提升AI生产力的核心。瓴羊Dataphin通过MCP(Model Context Protocol)服务助力企业高效挖掘数据价值。MCP采用SSE协议,提供listDataServiceAPI与invokeDataServiceAPI两种工具,简化数据集成与调用流程。例如,结合大模型可快速构建“智能查询助手”,实现自然语言查询数据功能。未来,Dataphin将持续迭代工具集,支持更多数据研发与治理场景。
733 0
|
NoSQL DataX 开发工具
TableStore: 使用Datax将实例A的数据迁移到实例B中
现在我们需要将数据从一个老的实例A迁移到实例B上面,做一下备份,我们打算使用Datax作为我们的数据传输工具,其中用到了otsreader和otswriter。
7754 136