apache phoenix sql 命令大全詳解

這是一份非常詳細的 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…