Skip to content

Phoenix

Phoenix 是 HBase 的 SQL 查询引擎,允许使用 SQL 语句查询 HBase 数据。

概述

Phoenix 提供了一个 JDBC 接口和 SQL 查询引擎,使得可以使用标准 SQL 查询 HBase 数据。

SQL 操作

创建表

sql
-- 创建表
CREATE TABLE IF NOT EXISTS user_profile (
    user_id VARCHAR PRIMARY KEY,
    name VARCHAR,
    age INTEGER,
    city VARCHAR
);

-- 创建带有列族的表
CREATE TABLE IF NOT EXISTS orders (
    order_id VARCHAR PRIMARY KEY,
    customer_id VARCHAR,
    amount DECIMAL(10, 2),
    order_time TIMESTAMP
) COLUMN FAMILY 'cf';

插入数据

sql
-- 插入数据
UPSERT INTO user_profile VALUES ('user001', 'Alice', 25, 'Beijing');
UPSERT INTO user_profile VALUES ('user002', 'Bob', 30, 'Shanghai');

-- 批量插入
UPSERT INTO user_profile 
SELECT * FROM temp_users WHERE status = 'active';

查询数据

sql
-- 基本查询
SELECT * FROM user_profile;

-- 条件查询
SELECT name, age FROM user_profile WHERE age > 25;

-- 排序
SELECT * FROM user_profile ORDER BY age DESC;

-- 聚合查询
SELECT city, COUNT(*) as count FROM user_profile GROUP BY city;

-- 连接查询
SELECT u.name, o.order_id 
FROM user_profile u
JOIN orders o ON u.user_id = o.customer_id;

更新数据

sql
-- 更新数据
UPSERT INTO user_profile SET city = 'Guangzhou' WHERE user_id = 'user001';

-- 增量更新
UPSERT INTO user_profile 
SET age = age + 1 
WHERE city = 'Beijing';

删除数据

sql
-- 删除单行
DELETE FROM user_profile WHERE user_id = 'user002';

-- 删除多行
DELETE FROM user_profile WHERE age > 30;

索引

创建索引

sql
-- 创建单列索引
CREATE INDEX idx_city ON user_profile(city);

-- 创建复合索引
CREATE INDEX idx_name_age ON user_profile(name, age);

-- 创建覆盖索引
CREATE INDEX idx_city_cover ON user_profile(city) INCLUDE (name, age);

删除索引

sql
DROP INDEX idx_city ON user_profile;

查看索引

sql
-- 查看表的索引
SELECT * FROM SYSTEM.CATALOG WHERE TABLE_NAME = 'USER_PROFILE' AND INDEX_NAME IS NOT NULL;

视图

创建视图

sql
-- 创建视图
CREATE VIEW active_users AS
SELECT user_id, name, age 
FROM user_profile 
WHERE age > 18;

-- 创建物化视图
CREATE MATERIALIZED VIEW mv_daily_sales AS
SELECT DATE(order_time) as date, SUM(amount) as total
FROM orders
GROUP BY DATE(order_time);

删除视图

sql
DROP VIEW active_users;

性能优化

并行查询

sql
-- 设置并行度
SET parallel = 4;

缓存

sql
-- 启用查询缓存
SET query.cache=true;

-- 设置缓存大小
SET query.cache.size=1000000;

统计信息

sql
-- 更新统计信息
ANALYZE TABLE user_profile;

-- 查看统计信息
SELECT * FROM SYSTEM.STATS WHERE TABLE_NAME = 'USER_PROFILE';

Java API

连接配置

java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

// 建立连接
Connection conn = DriverManager.getConnection("jdbc:phoenix:localhost");

// 创建语句
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM user_profile WHERE age > ?");
stmt.setInt(1, 18);

// 执行查询
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
    System.out.println(rs.getString("name"));
}

// 关闭资源
rs.close();
stmt.close();
conn.close();

优点

  • SQL 支持: 使用标准 SQL 查询 HBase
  • 性能优化: 自动优化查询计划
  • 索引支持: 支持多种索引类型
  • JDBC 兼容: 兼容标准 JDBC 接口
  • 事务支持: 支持单行事务