Phoenix 快速入门

Phoenix 表操作

显示所有表

!tables或者!table

在这里插入图片描述
创建表

CREATE TABLE IF NOT EXISTS us_population (
      state CHAR(2) NOT NULL,
      city VARCHAR NOT NULL,
      population BIGINT
      CONSTRAINT my_pk PRIMARY KEY (state, city));

说明:

  1. char类型必须添加长度限制
  2. varchar 可以不用长度限制
  3. 主键映射到 HBase 中会成为 Rowkey. 如果有多个主键(联合主键), 会把多个主键的值拼成 rowkey
  4. 在 Phoenix 中, 默认会把表名,字段名等自动转换成大写. 如果要使用消息, 需要把他们用双引号括起来.
    在这里插入图片描述
    插入记录
upsert into us_population values('NY','NewYork',8143197);
upsert into us_population values('CA','Los Angeles',3844829);
upsert into us_population values('IL','Chicago',2842518);

说明: upset可以看成是update和insert的结合体.
查询记录

select * from US_POPULATION;

在这里插入图片描述

select * from us_population where state='NY';

在这里插入图片描述
删除记录

delete from us_population where state='NY';

Phoenix 表映射

Phoenix 表和 HBase 表的关系
默认情况下, 直接在 HBase 中创建的表通过 Phoenix 是查不到的.
如果要在 Phoenix 中操作直接在 HBase 中创建的表,则需要在 Phoenix 中进行表的映射。
映射方式有两种: 1. 视图映射 2. 表映射
准备工作
在 HBase 中创建表: test, 两个列簇name、company.

  1. 启动 HBase shell
  2. 创建表: test
create 'test','name','company'

在 Phoenix 中是看不到这个表的

视图映射

Phoenix 创建的视图是只读的, 所以只能用来查询, 无法通过视图对数据进行修改等操作.

create view "test"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar);

在这里插入图片描述

表映射

使用 Phoenix创建对 HBase 的表映射,有两种方法:

  1. 当 HBase 中已经存在表时,可以以类似创建视图的方式创建关联表,只需要将create view 改为 create table 即可。 在 HBase 中创建表:
create 'test1','name','company'

在 Phoenix 中创建关联表:

create table "test1"(empid varchar primary key,"name"."firstname" varchar,"name"."lastname" varchar,"company"."name" varchar,"company"."address" varchar) column_encoded_bytes=0;

说明: 添加这个参数之后, 在 HBase 中添加的数据在 Phoenix 中也可以查询到. 否则 HBase 中添加的数据在 Phoenix 中查询不到.
2. 当 HBase 中不存在表时,可以直接使用 create table 指令创建需要的表,系统将会自动在 Phoenix 和 HBase 中创建 person_infomation 的表,并会根据指令内的参数对表结构进行初始化。
例子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

视图映射和表映射的对比与总结

相比于直接创建映射表,视图的查询效率会低, 原因是:创建映射表的时候,Phoenix 会在表中创建一些空的键值对,这些空键值对的存在可以用来提高查询效率。
使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。但是视图就不会,如果删除视图,源数据不会发生改变。

Phoenix 创建 HBase 二级索引

在前面的学习中, 我们知道 HBase 只能通过 rowkey 进行搜索, 一般把 rowkey 称作一级索引. 在很长的一段时间里 HBase 就只支持一级索引.
HBase 里面只有 rowkey 作为一级索引, 如果要对库里的非 rowkey 字段进行数据检索和查询, 往往要通过 MapReduce/Spark 等分布式计算框架进行,硬件资源消耗和时间延迟都会比较高。
为了 HBase 的数据查询更高效、适应更多的场景, 诸如使用非 rowkey 字段检索也能做到秒级响应,或者支持各个字段进行模糊查询和多字段组合查询等, 因此需要在 HBase 上面构建二级索引, 以满足现实中更复杂多样的业务需求。
从 0.94 版本开始, HBase 开始支持二级索引.
给 color 字段添加索引

CREATE INDEX fruit_color ON "fruit1"("info"."color");

查询是否添加成功索引
在phoneix中如果出现了FULL SCAN ,代表没有使用上二级索引,出现了全部列扫描
如果出现RANGE SCAN OVER IDX_AGE,代表使用上了某个索引,进行了范围查询!
在这里插入图片描述

Phoenix 索引分类

全局索引
global index 是默认的索引格式。
适用于多读少写的业务场景。写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。
在读数据的时候 Phoenix 会选择索引表来降低查询消耗的时间。
如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。
创建全局索引的方法:

CREATE INDEX fruit_color ON "fruit1"("info"."color");

局部索引
local index 适用于写操作频繁的场景。索引数据和数据表的数据是存放在相同的服务器中的,避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。
查询的字段不是索引字段索引表也会被使用,这会带来查询速度的提升。
创建局部索引的方法(相比全局索引多了一个关键字 local):

CREATE LOCAL INDEX fruit_color ON "fruit1"("info"."color");

删除索引

DROP INDEX fruit_color ON "fruit1"

索引总结

1.在hbase中,查询数据时,一般都会指定rowkey,或指定rowkey的范围!
rowkey称为一级索引
如果查询某个具体的列,hbase在高版本也支持在列上创建索引,在列上创建的索引称为二级索引!
之前如果要创建二级索引,需要自己调用HBase的API,写起来很麻烦!
如果使用Phoneix,只需要一行create index 索引名 on 表名(列) SQL,Phoneix帮助我们创建二级索引!
二级索引的目的在想执行查询某些列的数据时,加快效率!
2. 使用explain + select sql查看是否使用了索引
在mysql中 type=All,代表全部扫描,没有使用上索引!
在phoneix中如果出现了FULL SCAN ,代表没有使用上二级索引,出现了全部列扫描
测试时不能写select *;
如果出现RANGE SCAN OVER IDX_AGE,代表使用上了某个索引,进行了范围查询!
3. 索引的使用
创建索引: create index idx_age on “t3”(“info”.“age”);
删除索引: drop index 索引名 on 表名
4. 二级索引的分类
在hbase中二级索引分为gloal(全局)和local(本地)的二级索引!
不管是全局索引还是本地索引,都是为了加快查询!从作用上说,没有区别!
区别在于适合的场景不同:
gloal(全局)索引,在创建后,专门在hbase中,生成一个表,讲索引的信息存储在表中!
适合多读少写的场景! 每次写操作,不仅要更新数据,还需要更新索引!
数据表在rs1,索引表在rs2中,每次发送一次put请求,必须先请求rs1,在请求rs2,才能完成更新!网络开销很大,加重rs的压力!
local(本地)索引,在创建后,在表中,创建一个列族,在这个列族中保存索引的信息!
适合多写少读的场景! 索引是以列族的形式在表中存储,索引和数据在一个rs上,此时频繁写操作时,只需要请求当前的regionserver!

猜你喜欢

转载自blog.csdn.net/qq_46548855/article/details/107989874