Phoenix的介绍
功能
Phoenix是一种专门针对于Hbase 所设计的SQL on Hbase 的一个工具
使用SQL对Hbase进行操作
使用phoenix自动构建二级索引来进行快速查询和维护
原理
- 上层提供了SQL接口
- 底层全部通过Hbase Java API来实现,通过构建一系列的Scan和Put来实现数据的读写
- 功能非常丰富
- 底层封装了大量的内置的协处理器,可以实现各种复杂的处理需求,例如二级索引等
特点
- 优点
- 支持SQL接口
- 支持自动维护二级索引
- 缺点
- SQL支持的语法不全面
- Bug比较多
- Hive on Hbase对比
- Hive:SQL更加全面,但是不支持二级索引,底层通过分布式计算工具来实现
- Phoenix:SQL相对支持不全面,但是性能比较好,直接使用HbaseAPI,支持索引实现
个人理解
如果HBASE中有表 而Phoenix中没有这张表 通过在Phoenix创建一样的库 一样的表名 就能自动关联hbase对应的表
如果Phoenix和hbase中都不存在这张表 name直接在Phoenix创建表 hbase会自动也创建
Phoenix的用法
DDL——NS操作
创建NS
create schema if not exists student;
切换NS
use NameSpace
删除NS
drop schema if exists Namespace;
小结
- 用法和SQL基本一致
- Phoenix会默认转为大写 如果想用小写 必须加双引号
DDL——Table操作
列举所有表
!tables
创建表
CREATE TABLE my_table (
id INTEGER not null primary key desc,
m.date DATE not null,
m.db_utilization DECIMAL,
i.db_utilization
) m.VERSIONS='3';
如果Hbase中没有该表
举个例子:
use default;
create table if not exists ORDER_DTL(
ID varchar primary key,
C1.STATUS varchar,
C1.PAY_MONEY float,
C1.PAYWAY integer,
C1.USER_ID varchar,
C1.OPERATION_DATE varchar,
C1.CATEGORY varchar
);
如果Hbase中已存在会自动关联
create table if not exists ORDER_INFO(
"ROW" varchar primary key,
"C1"."USER_ID" varchar,
"C1"."OPERATION_DATE" varchar,
"C1"."PAYWAY" varchar,
"C1"."PAY_MONEY" varchar,
"C1"."STATUS" varchar,
"C1"."CATEGORY" varchar
) column_encoded_bytes=0 ;
查看
!desc 表名
删除
drop table if exists 表名
插入数据和更新数据【upsert】
语法 :upsert into 表名(列1,列2) values(值1,值2) ON DUPLICATE KEY IGNORE;
DML——delete操作
删除USER_ID为123456的rowkey数据
delete from order_info where USER_ID = '123456';
DML——select操作
· --以前的写法:limit M,N
--M:开始位置
--N:显示的条数
--Phoenix的写法:limit N offset M
select * from order_info limit 6 offset 60;//总共66行,显示最后6行
预分区
create table if not exists ORDER_DTL(
"id" varchar primary key,
C1."status" varchar,
C1."money" float,
C1."pay_way" integer,
C1."user_id" varchar,
C1."operation_time" varchar,
C1."category" varchar
)
CONPRESSION='GZ'
SPLIT ON ('3','5','7');
加盐
目的:为了避免rowkey的连续 热点问题
CREATE TABLE table (
a_key VARCHAR PRIMARY KEY,
a_col VARCHAR
) SALT_BUCKETS = 20;//创建一张盐表 为20个分区
加盐就是在rowkey的前缀添加了一些东西
视图
个人理解
就好比在Hbase中的default名字空间下有一张ti表
我在Phoenix中建一张视图表对t1表进行只读操作
当hbase中把t1表删除,Phoenix的视图表依然不会消失 要手动删除
注意:视图表只关联hbase已存在的表
视图表创建
create view if not exists "MOMO_CHAT"."MSG" (
"pk" varchar primary key, -- 指定ROWKEY映射到主键
"C1"."msg_time" varchar,
"C1"."sender_nickyname" varchar,
"C1"."sender_account" varchar,
"C1"."sender_sex" varchar,
"C1"."sender_ip" varchar,
"C1"."sender_os" varchar,
"C1"."sender_phone_type" varchar,
"C1"."sender_network" varchar,
"C1"."sender_gps" varchar,
"C1"."receiver_nickyname" varchar,
"C1"."receiver_ip" varchar,
"C1"."receiver_account" varchar,
"C1"."receiver_os" varchar,
"C1"."receiver_phone_type" varchar,
"C1"."receiver_network" varchar,
"C1"."receiver_gps" varchar,
"C1"."receiver_sex" varchar,
"C1"."msg_type" varchar,
"C1"."distance" varchar
);
视图表的删除
drop view table if exists 表名;