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 接口
- 事务支持: 支持单行事务