这是一份非常详细的 Apache Phoenix SQL 命令大全和详解。Phoenix 作为 HBase 上的 SQL 层,其语法大部分与标准 SQL 兼容,但也有许多针对 HBase 的特性扩展。


核心概念

在开始之前,请记住 Phoenix 的两个核心概念:

  1. 主键(PRIMARY KEY)必须存在。它映射到 HBase 的 Row Key,并且所有列都会自动编码到主键的列族中(除非单独指定)。主键可以是复合主键。
  2. 列族(COLUMN_FAMILY):HBase 的概念。在 Phoenix 中,可以在建表时或通过 ALTER 命令为列指定列族,以实现更好的物理存储分组。

一、DDL(数据定义语言)

1. CREATE TABLE - 创建表

创建表是 Phoenix 中最关键的操作,因为它直接影响到 HBase 的存储结构和查询性能。

基础语法:

CREATE TABLE [IF NOT EXISTS] schema_name.table_name (column_name data_type [PRIMARY KEY] [NULL | NOT NULL] [DEFAULT value],column_name data_type [NULL | NOT NULL],...CONSTRAINT constraint_name PRIMARY KEY (column1, column2, ...)
) [TABLENAME='hbase_namespace:hbase_table',][COLUMN_FAMILY='family_name',][SALT_BUCKETS=integer],[DISABLE_WAL=false|true],[IMMUTABLE_ROWS=true|false],[COMPRESSION='GZ'|'LZ4'|'NONE'|'SNAPPY'],[TTL=integer],[UPDATE_CACHE_FREQUENCY=integer];

关键参数详解:

  • TABLENAME: 指定映射到的 HBase 表名。如果省略,Phoenix 会创建一个同名的 HBase 表。
  • SALT_BUCKETS (极重要): 加盐。通过预分区(split)来解决写热点问题。值通常是 region server 数量的倍数。强烈建议对写密集的表使用此选项。
  • DISABLE_WAL: 是否禁用 HBase 的预写日志(Write-Ahead Log)。禁用后可提高写入速度,但存在数据丢失风险。通常用于可以容忍数据丢失的临时数据。
  • IMMUTABLE_ROWS: 表是否不可变。如果为 true,则优化写入路径,适用于只写入一次的数据(如日志)。
  • COMPRESSION: 设置 HBase 表的压缩算法,节省存储空间。
  • TTL: 行的存活时间(秒),超过时间的数据会自动被 HBase 清除。
  • UPDATE_CACHE_FREQUENCY: 指导客户端何时更新元数据缓存。

示例:

-- 简单创建表,id是主键(即HBase的Row Key)
CREATE TABLE my_table (id VARCHAR PRIMARY KEY,name VARCHAR,age INTEGER
);-- 使用复合主键((user_id, transaction_id) 共同组成Row Key)
CREATE TABLE orders (user_id VARCHAR NOT NULL,transaction_id VARCHAR NOT NULL,date DATE,amount DECIMAL(10, 2),CONSTRAINT pk PRIMARY KEY (user_id, transaction_id) -- 复合主键
);-- 高级创建表,指定盐桶、压缩、列族和TTL
CREATE TABLE event_log (event_id BIGINT NOT NULL,event_time TIMESTAMP NOT NULL,payload VARCHAR,CONSTRAINT pk PRIMARY KEY (event_id, event_time)
) 
SALT_BUCKETS = 10, 
COMPRESSION = 'GZ', 
TTL = 86400, -- 数据保留1天(60*60*24)
UPDATE_CACHE_FREQUENCY = 3000;
2. CREATE VIEW - 创建视图

视图是只读的,映射到一个已存在的 HBase 表。用于为现有 HBase 表提供 Phoenix SQL 接口。

语法:

CREATE VIEW [IF NOT EXISTS] view_name (column_name data_type [PRIMARY KEY] [NULL | NOT NULL],...
) AS SELECT * FROM existing_hbase_table;
-- 或者直接映射,但需要指定列
CREATE VIEW "my_hbase_table" ( pk VARCHAR PRIMARY KEY, "col1"."value" VARCHAR );

注意:如果 HBase 表名或列族名不是大写,需要用双引号引起来。

3. CREATE INDEX - 创建二级索引

二级索引可以极大提高对非主键列的查询速度。

语法:

CREATE INDEX [IF NOT EXISTS] index_name 
ON table_name (column_list)
[INCLUDE (include_column_list)] -- 覆盖索引,避免回查主表
[ASYNC] -- 异步构建索引
[INDEX_TYPE='index_type']; -- 索引类型(GLOBAL, LOCAL, ...)

索引类型:

  • 全局索引(GLOBAL):默认。适用于读多写少的场景。查询时必须包含索引中的列才能生效,否则会全表扫描。
  • 本地索引(LOCAL):适用于写多读少的场景。查询时即使未完全覆盖索引列,也能利用索引。LOCAL 索引数据和原数据存储在同一个 Region 中。

示例:

-- 创建全局索引
CREATE INDEX idx_name ON my_table (name);-- 创建覆盖索引(Include),查询age时无需回表
CREATE INDEX idx_name_include_age ON my_table (name) INCLUDE (age);-- 创建异步全局索引
CREATE INDEX async_idx ON my_table (age) ASYNC;-- 创建本地索引
CREATE LOCAL INDEX local_idx ON orders (date);
4. ALTER TABLE - 修改表

语法:

-- 添加列
ALTER TABLE table_name ADD column_name data_type [NULL | NOT NULL];-- 删除列
ALTER TABLE table_name DROP COLUMN column_name;-- 修改列数据类型(需兼容)
ALTER TABLE table_name ALTER COLUMN column_name SET DATA_TYPE new_data_type;

示例:

ALTER TABLE my_table ADD email VARCHAR;
ALTER TABLE my_table DROP COLUMN email;
5. DROP - 删除

语法:

-- 删除表(也会删除HBase中的表)
DROP TABLE [IF EXISTS] table_name;-- 删除视图
DROP VIEW [IF EXISTS] view_name;-- 删除索引
DROP INDEX [IF EXISTS] index_name ON table_name;

二、DML(数据操纵语言)

1. UPSERT - 插入/更新

Phoenix 使用 UPSERT 而不是标准的 INSERTUPDATE。如果行存在则更新,不存在则插入。这直接对应 HBase 的 Put 操作。

语法:

UPSERT INTO table_name [(column1, column2, ...)] 
VALUES (value1, value2, ...);UPSERT INTO table_name [(column1, column2, ...)] 
SELECT ... FROM another_table;

示例:

-- 插入单条数据
UPSERT INTO my_table (id, name, age) VALUES ('001', 'Alice', 25);-- 插入多条数据(Phoenix 4.8+)
UPSERT INTO my_table VALUES ('002', 'Bob', 30), ('003', 'Charlie', 28);-- 从查询结果插入
UPSERT INTO target_table (col1, col2)
SELECT source_col1, source_col2 FROM source_table;
2. DELETE - 删除数据

语法:

DELETE FROM table_name [WHERE clause];

警告:如果没有 WHERE 子句,将清空整个表!

示例:

DELETE FROM my_table WHERE id = '001';
DELETE FROM orders WHERE amount < 10;
3. SELECT - 查询数据

语法与标准 SQL 基本一致。

语法:

SELECT [DISTINCT] column_list 
FROM table_name 
[WHERE clause] 
[GROUP BY column_list] 
[HAVING clause] 
[ORDER BY column_list [ASC|DESC]] 
[LIMIT number] 
[OFFSET number];

特殊函数和操作:

  • COUNT(), SUM(), AVG(), MIN(), MAX(): 聚合函数。
  • SUBSTR(string, start, length): 子字符串函数。
  • TO_DATE(string), TO_NUMBER(string): 类型转换函数。
  • EXPLAIN: 查看查询执行计划,用于性能调优。

示例:

-- 简单查询
SELECT * FROM my_table WHERE name = 'Alice';-- 分页查询
SELECT id, name FROM orders ORDER BY date DESC LIMIT 10 OFFSET 20;-- 聚合查询
SELECT user_id, SUM(amount) as total_amount 
FROM orders 
GROUP BY user_id 
HAVING total_amount > 1000;-- 使用EXPLAIN查看执行计划,判断是否使用了索引
EXPLAIN SELECT * FROM my_table WHERE name = 'Alice';
-- 输出中如果出现 `FULL SCAN`,则可能性能较差。
-- 如果出现 `RANGE SCAN OVER INDEX_NAME`,则说明索引生效。

三、系统与元数据命令

1. 查看表信息
!tables
!-- 或者
!table

此命令列出当前连接中的所有 Phoenix 表和视图。

2. 查看表结构
!describe table_name
!-- 或者
!desc table_name
3. 查看索引
!indexes table_name

列出指定表上的所有索引。

4. 查看查询计划
EXPLAIN your_select_query;
5. 性能分析
EXPLAIN ANALYZE your_select_query;

不仅显示计划,还会实际执行并报告每个步骤花费的时间。


四、实用技巧和注意事项

  1. 大小写敏感

    • 如果不加双引号,Phoenix 会自动将表名、列名等转换为大写
    • 如果 HBase 中的表名或列族/列名是小写或混合大小写,必须在 Phoenix 中用双引号引起来
    • 例如:CREATE VIEW "myLowerCaseTable" (...);
  2. Row Key 设计:Phoenix 的性能极度依赖 Row Key(主键)的设计。遵循 HBase 的最佳实践:

    • 避免单调递增的 Row Key(如自增ID),以免造成写热点。使用加盐(SALT_BUCKETS)哈希 来分散写入。
    • 将常用的查询条件放在主键的前面部分(对于复合主键)。
  3. 二级索引选择

    • 全局索引:读快写慢,需要覆盖索引。
    • 本地索引:写快读慢,查询时更灵活,无需覆盖索引。
  4. 批量处理:在 sqlline.py 中,使用 upsert 批量插入数据时,先执行 autocommit off; 可以大幅提升性能,最后再执行 commit;

  5. JDBC 连接:在 Java 应用中,使用 Phoenix 的 JDBC 驱动来连接,URL 格式为:jdbc:phoenix:zookeeper_quorum[:port][:/hbase-root-znode]

总结

命令类别核心命令主要用途和特点
DDLCREATE TABLE核心,需精心设计主键和盐桶
CREATE INDEX提高查询性能,分全局和本地
ALTER TABLE / DROP修改结构,删除对象
DMLUPSERT插入和更新(HBase Put)
SELECT查询,支持大部分SQL语法
DELETE删除数据
系统命令!tables, !desc查看元数据
EXPLAIN性能调优神器

建议:在测试环境中结合实际用例进行练习,并经常使用 EXPLAIN 来分析查询性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97992.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97992.shtml
英文地址,请注明出处:http://en.pswp.cn/web/97992.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【代码讲解】SO-ARM100 双场景演示:手柄驱动 Mujoco 仿真 + 实机控制

视频讲解&#xff1a; 【代码讲解】SO-ARM100 双场景演示&#xff1a;手柄驱动 Mujoco 仿真 实机控制今天介绍下使用使用北通手柄通过控制 Mujoco 中的 SO-ARM100 机械臂&#xff0c;然后将关节数据通过 zmq 通信转发控制实际机械臂。 本期中会涉及如下点&#xff0c;需要注意…

「数据获取」《中国教育经费统计年鉴》(1997-2024)

01、数据简介《中国教育经费统计年鉴》作为我国教育经费领域的核心统计典籍&#xff0c;全面系统地呈现了全国各级各类教育经费的来源构成、分配流向与使用成效。其统计范围覆盖学前教育、基础教育、中等职业教育、高等教育及特殊教育等全学段&#xff0c;数据维度涵盖财政性教…

使用 Logspout 收集所有容器的

1.将所有容器的输出路由到远程 rsyslog 服务器1.修改 rsyslog 配置文件/etc/rsyslog.conf, 从中找到 “# Provides UDP sysilog recepion"语句。并将该处的以下两行配置代码行首的“#”字符删除&#xff08;取消注释&#xff09;[roothost1 ~]# vi /etc/rsyslog.conf [roo…

【智能化解决方案】基于多目标优化检索增强生成的智能行程规划方案

&#x1f4dd; 基于多目标优化的智能行程规划方案 1 用户需求分析与矩阵构建 1.1 核心用户信息提取 根据用户提供的年龄、出发地、目的地、出行时间等基本信息&#xff0c;我们首先构建一个用户特征向量&#xff1a; U {Age, Origin, Destination, TravelDate, Duration, Budg…

软件研发的演变

软件研发从一门手工作坊式的艺术&#xff0c;逐步演进为一门系统化、工程化、智能化的现代学科。其发展历程不仅体现了技术的飞跃&#xff0c;更反映了方法论、协作模式和思维方式的深刻变革。一、发展演变历程软件研发的演变可以大致划分为以下几个阶段&#xff1a;1. 软件作坊…

「日拱一码」091 机器学习——集成学习

目录 集成学习介绍 1. 核心思想 2. 为什么有效&#xff1f; 3. 主要流派与方法 A. 并行方法&#xff1a;Bagging (Bootstrap Aggregating) B. 串行方法&#xff1a;Boosting C. 堆叠法&#xff1a;Stacking 代码示例 Bagging 的代表 —— 随机森林 (Random Forest) 集成…

vscode实现第三方包的使用,cmake结合vcpkg(跨平台)

要使用cmake和vcpkg组织一个完整的现代cpp项目&#xff0c;一般来说需要三个文件vcpkg.json描述第三方依赖项//vcpkg.json {"dependencies": ["fmt"] }//安装,在vcpkg.json目录执行 vcpkg installCMakePresets.json定义项目的本质属性&#xff08;What&…

DevExpress中Word Processing Document API学习记录

文章目录1 文档结构划分2 文档操作基础2.1 Positions and Ranges2.2 Secitions2.3 Paragraphs2.4 Tables2.5 Lists2.6 Hyperlinks and Bookmarks2.7 Comments2.8 Headers and Footers2.9 Shapes and Pictures2.10 Watermarks2.11 Charts2.12 OLE Objects2.13 ActiveX Controls2…

Roo Code 的差异_快速编辑功能

什么是差异编辑&#xff1f; 简单来说&#xff0c;差异编辑就像是一位细心的装修师傅&#xff1a;他不会把整个房子拆掉重盖&#xff0c;而是精准地只修补需要改动的部分。Roo Code 的这项功能默认开启&#xff0c;它通过比对代码差异&#xff08;diff&#xff09;来实施修改&a…

【Axure高保真原型】标签树分类查询案例

今天和大家分享标签树分类查询案例的原型模版&#xff0c;效果包括&#xff1a; 树形分类——点击左侧树形里的箭头&#xff0c;可以展开或收起子级选项&#xff1b; 查询表格——点击标签树里的选项&#xff0c;如果是末级选项&#xff0c;可以筛选右侧表格用户标签&#xf…

容器化部署项目05

一、工作原理 镜像&#xff1a;容器的模板&#xff0c;包括容器运行时所需的数据 容器&#xff1a;运行中的进程&#xff0c;依赖镜像运行&#xff0c;镜像的具现化 镜像你可以把它看成Python中的类&#xff0c;而容器可以看做是类的实例化对象。 一个类可以有多个对象&#xf…

微信小程序 工作日历 周计划日报 修改等提报和状态展示功能,支持h5,Android ,ios,基于uniapp,适配vue2和vue3

Work-calendar 介绍 &#xff08;底部附链接&#xff09; 基于uni-calendar做的定制化开发&#xff0c;主要功能为工作日历展示和提报组件 ​ 1.支持周计划日报状态展示且可配置 ​ 2.支持农历展示配置&#xff0c;回到当日&#xff0c;月份切换 ​ 3.日历&#xff0c;周报…

openharmony 鸿蒙 下 利用蓝牙API(a2dp模块-高级音频,ble模块-低功耗蓝牙等)完成对蓝牙音响的控制(蓝牙广播)

1.首先是登录页面&#xff08;利用webapi 和本地数据存储完成登陆操作&#xff09; 2.添加设备&#xff08;利用ble.startBLEScan 和 ble.on("BLEDeviceFind", onReceiveEvent);完成蓝牙扫描与显示&#xff09; 3.蓝牙ble连接&#xff08;利用ble.createGattClientDe…

17、逻辑回归与分类评估 - 从连续到离散的智能判断

学习目标:理解分类问题的本质和评估方法,掌握逻辑回归的数学原理和概率解释,学会二分类和多分类问题的处理方法,熟练使用分类评估指标,理解过拟合和正则化的基本概念。 > 从第16章到第17章:从预测数值到判断类别 在第16章中,我们学习了线性回归,解决的是预测连续数…

自动化脚本的核心引擎

自动化脚本作为现代软件开发与运维的重要工具&#xff0c;其核心引擎承担着解析指令、调度任务和执行逻辑的关键职能。这种引擎本质上是一个轻量级的运行时环境&#xff0c;通过预定义的规则集将人类可读的脚本语言转化为机器可执行的原子操作。在持续集成/持续交付&#xff08…

【Vue2 ✨】Vue2 入门之旅 · 进阶篇(九):Vue2 性能优化

在前几篇文章中&#xff0c;我们学习了 Vuex 的内部机制以及 Vue Router 的工作原理。本篇将深入探讨 Vue2 性能优化&#xff0c;帮助你掌握在开发中提升 Vue 应用性能的方法和技巧。 目录 性能优化的意义响应式系统优化虚拟 DOM 与渲染优化组件懒加载与按需渲染事件与计算属性…

【题解】B2600 【深基1.例2】简单的分苹果

题目描述 这里有 101010 个苹果&#xff0c;小 A 拿走了 222 个&#xff0c;Uim 拿走了 444 个&#xff0c;八尾勇拿走剩下的所有的苹果。我们想知道&#xff1a; 小A 和 Uim 两个人一共拿走多少苹果&#xff1f;八尾勇能拿走多少苹果&#xff1f; 现在需要编写一个程序&#x…

中小企业 4G 专网部署:性能与成本的最佳平衡

在数字化转型的浪潮中&#xff0c;中小企业同样需要安全、稳定和高效的通信网络。然而&#xff0c;传统专网的高成本和复杂部署往往成为阻碍。IPLOOK 提供的4G轻量级核心网与专网解决方案&#xff0c;正是帮助中小企业在性能与成本之间找到最佳平衡的关键。 中小企业的网络挑…

LeetCode每日一题,20250914

元音拼写检查器 思路 精确匹配 用 HashSet 保存原始单词&#xff0c;查询时直接判断是否存在。 大小写忽略匹配 用 HashMap<String, String> 保存 小写单词 -> 第一次出现的原始单词。用 putIfAbsent&#xff0c;确保只记录第一次出现的单词。 元音模糊匹配 把单词…

i2s_record_play

这章主要讲述i2s 1&#xff1a;环境及配件 esp32c3 esp32s3 idf5.4.1 INMP441 MAX98357A 都使用dma 2&#xff1a;eps32c3 测试 只有1个i2s 只能一边录 完 再播放 &#xff0c;内存太小&#xff0c;这里用 flash 存audio里 只说能 录音 能播放 &#xff0c;效果不好&#xff0…