Phoenix与Hbase的关系

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 表名;

Guess you like

Origin blog.csdn.net/qq_45769990/article/details/115180820