Hbase索引( Phoenix二级索引)

  • 1、 Phoenix简介
    • 1.1、Phoenix安装
    • 1.2、常用命令
    • 1.3、phoenix表映射
      • 1.3.1、视图映射
      • 1.3.2、表映射
      • 1.3.3、视图映射与表映射区别
  • 2、Phoenix二级索引
    • 2.1、开启索引支持
    • 2.2、全局索引
      • 2.2.1、创建全局索引
    • 2.3、本地索引
    • 2.4、覆盖索引
  • 3、Phoenix JDBC

1、 Phoenix简介

  Hbase适合存储大量的对关系运算要求低的NOSQL数据,受Hbase 设计上的限制不能直接使用原生的API执行在关系数据库中普遍使用的条件判断和聚合等操作。Hbase很优秀,一些团队寻求在Hbase之上提供一种更面向普通开发人员的操作方式,Apache Phoenix即是。
  Phoenix 基于Hbase给面向业务的开发人员提供了以标准SQL的方式对Hbase进行查询操作,并支持标准SQL中大部分特性:条件运算,分组,分页,等高级查询语法。

1.1、Phoenix安装

下载安装包:官网地址
上传解压修改名称等
将jar包复制到所有节点的hbase lib目录下


配置环境变量

启动hbase
start-hbase.sh
启动 Phoenix
sqlline.py master,node1,node2

1.2、常用命令

# 1、创建表CREATE TABLE IF NOT EXISTS STUDENT (id VARCHAR NOT NULL PRIMARY KEY, name VARCHAR,age BIGINT, gender VARCHAR ,clazz VARCHAR
);# 2、显示所有表!table# 3、插入数据
upsert into STUDENT values('1500100004','葛德曜',24,'男','理科三班');
upsert into STUDENT values('1500100005','宣谷芹',24,'男','理科六班');
upsert into STUDENT values('1500100006','羿彦昌',24,'女','理科三班');# 4、查询数据,支持大部分sql语法,
select * from STUDENT ;
select * from STUDENT where age=24;
select gender ,count(*) from STUDENT group by gender;
select * from student order by gender;# 5、删除数据
delete from STUDENT where id='1500100004';# 6、删除表
drop table STUDENT;# 7、退出命令行
!quit

更多语法参照官网:官网语法地址

1.3、phoenix表映射

默认情况下,直接在hbase中创建的表,通过phoenix是查看不到的

如果需要在phoenix中操作直接在hbase中创建的表,则需要在phoenix中进行表的映射。映射方式有两种:视图映射和表映射

1.3.1、视图映射

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

# hbase shell 进入hbase命令行
hbase shell # 创建hbase表
create 'student','info' # 插入数据
put 'student','1001','info:name','zs'
put 'student','1001','info:age','20'
put 'student','1001','info:gender','m'put 'student','1002','info:name','ls'
put 'student','1002','info:age','21'
put 'student','1002','info:gender','f'

查看数据scan 'student'

# 在phoenix创建视图, primary key 对应到hbase中的rowkeycreate view "student"(
id varchar primary key,
"info"."name" varchar,
"info"."age"  varchar,
"info"."gender"  varchar
);# 在phoenix查询数据,表名通过双引号引起来
select * from "student";# 删除视图
drop view "student";


1.3.2、表映射

使用Apache Phoenix创建对HBase的表映射,有两类:

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

2)当HBase中不存在表时,可以直接使用create table指令创建需要的表,并且在创建指令中可以根据需要对HBase表结构进行显示的说明。

第一种情况,创建表映射的方式如下:

create table "student" (id VARCHAR NOT NULL PRIMARY KEY, "info"."name" VARCHAR,"info"."age" VARCHAR, "info"."gender" VARCHAR
) column_encoded_bytes=0;

创建表映射时必须加column_encoded_bytes=0

1.3.3、视图映射与表映射区别

使用create table创建的关联表,如果对表进行了修改,源数据也会改变,同时如果关联表被删除,源表也会被删除。
使用create view创建的关联表,不能对数据进行修改,只能对数据进行查询,如果删除视图,源数据不会发生改变。

2、Phoenix二级索引

对于Hbase,如果想精确定位到某行记录,唯一的办法就是通过rowkey查询。如果不通过rowkey查找数据,就必须逐行比较每一行的值,对于较大的表,全表扫描的代价是不可接受的。

2.1、开启索引支持

在hbase的conf目录下的hbase-site.xml中增加以下配置,并将修改的配置文件同步到其它节点上

<property><name>hbase.regionserver.wal.codec</name><value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
<property><name>hbase.rpc.timeout</name><value>60000000</value>
</property>
<property><name>hbase.client.scanner.timeout.period</name><value>60000000</value>
</property>
<property><name>phoenix.query.timeoutMs</name><value>60000000</value>
</property>

修改phoenix目录下的bin目录中的hbase-site.xml
添加以下内容

<property><name>hbase.rpc.timeout</name><value>60000000</value>
</property>
<property><name>hbase.client.scanner.timeout.period</name><value>60000000</value>
</property>
<property><name>phoenix.query.timeoutMs</name><value>60000000</value>
</property>

修改完成后重新启动hbase与Phoenix

2.2、全局索引

  全局索引适合读多写少的场景。如果使用全局索引,读数据基本不损耗性能,所有的性能损耗都来源于写数据。数据表的添加、删除和修改都会更新相关的索引表(数据删除了,索引表中的数据也会删除;数据增加了,索引表的数据也会增加)

  注意: 对于全局索引在默认情况下,在查询语句中检索的列如果不在索引表中,Phoenix不会使用索引表,除非使用hint。

创建DIANXIN.sql和上传数据文件DIANXIN.csv

# 创建DIANXIN.sql
CREATE TABLE IF NOT EXISTS DIANXIN (mdn VARCHAR ,start_date VARCHAR ,end_date VARCHAR ,county VARCHAR,x DOUBLE ,y  DOUBLE,bsid VARCHAR,grid_id  VARCHAR,biz_type VARCHAR, event_type VARCHAR , data_source VARCHAR ,CONSTRAINT PK PRIMARY KEY (mdn,start_date)
) column_encoded_bytes=0;

phoenix导入数据
psql.py master,node1,node2 DIANXIN.sql DIANXIN.csv

成功导入数据

2.2.1、创建全局索引

原理:创建索引是将要创建的索引列与rowkey进行拼接,然后使用rowkey的前缀过滤来实现毫秒级查询
创建全局索引时有点慢

# 创建全局索引
CREATE INDEX DIANXIN_INDEX ON DIANXIN ( end_date );# 查询数据 ( 索引未生效)
select * from DIANXIN where end_date = '20180503154014';# 强制使用索引 (索引生效) hint
select /*+ INDEX(DIANXIN DIANXIN_INDEX) */  * from DIANXIN where end_date = '20180503154014';select /*+ INDEX(DIANXIN DIANXIN_INDEX) */  * from DIANXIN where end_date = '20180503154014'  and start_date = '20180503154614';# 取索引列,(索引生效)
select end_date from DIANXIN where end_date = '20180503154014';# 创建多列索引
CREATE INDEX DIANXIN_INDEX1 ON DIANXIN ( end_date,COUNTY );# 多条件查询 (索引生效)
select end_date,MDN,COUNTY from DIANXIN where end_date = '20180503154014' and COUNTY = '8340104';# 查询所有列 (索引未生效)
select  * from DIANXIN where end_date = '20180503154014'  and COUNTY = '8340104';# 查询所有列 (索引生效)
select /*+ INDEX(DIANXIN DIANXIN_INDEX1) */ * from DIANXIN where end_date = '20180503154014' and COUNTY = '8340104';# 单条件  (索引未生效)
select end_date from DIANXIN where  COUNTY = '8340103';
# 单条件  (索引生效) end_date 在前
select COUNTY from DIANXIN where end_date = '20180503154014';# 删除索引
drop index DIANXIN_INDEX on DIANXIN;

2.3、本地索引

  本地索引适合写多读少的场景,或者存储空间有限的场景。和全局索引一样,Phoenix也会在查询的时候自动选择是否使用本地索引。本地索引因为索引数据和原数据存储在同一台机器上,避免网络数据传输的开销,所以更适合写多的场景。由于无法提前确定数据在哪个Region上,所以在读数据的时候,需要检查每个Region上的数据从而带来一些性能损耗。

注意:对于本地索引,查询中无论是否指定hint或者是查询的列是否都在索引表中,都会使用索引表。

# 创建本地索引
CREATE LOCAL INDEX DIANXIN_LOCAL_IDEX ON DIANXIN(grid_id);# 索引生效
select grid_id from dianxin where grid_id='117285031820040';# 索引生效
select * from dianxin where grid_id='117285031820040';

2.4、覆盖索引

  覆盖索引是把原数据存储在索引数据表中,这样在查询时不需要再去HBase的原表获取数据就,直接返回查询结果。

注意:查询是 select 的列和 where 的列都需要在索引中出现。

# 创建覆盖索引
CREATE INDEX DIANXIN_INDEX_COVER ON DIANXIN ( x,y ) INCLUDE ( county );# 查询所有列 (索引未生效)
select * from DIANXIN where x=117.288 and y =31.822;# 强制使用索引 (索引生效)
select /*+ INDEX(DIANXIN DIANXIN_INDEX_COVER) */ * from DIANXIN where x=117.288 and y =31.822;# 查询索引中的列 (索引生效) mdn是DIANXIN表的RowKey中的一部分
select x,y,county from DIANXIN where x=117.288 and y =31.822;
select mdn,x,y,county from DIANXIN where x=117.288 and y =31.822;# 查询条件必须放在索引中  select 中的列可以放在INCLUDE (将数据保存在索引中)
select /*+ INDEX(DIANXIN DIANXIN_INDEX_COVER) */ x,y,count(*) from DIANXIN group by x,y;

3、Phoenix JDBC

添加依赖

<dependency><groupId>org.apache.phoenix</groupId><artifactId>phoenix-core</artifactId><version>4.15.0-HBase-1.4</version>
</dependency>

示例代码

Connection conn = DriverManager.getConnection("jdbc:phoenix:master,node1,node2:2181");PreparedStatement ps = conn.prepareStatement("select /*+ INDEX(DIANXIN DIANXIN_INDEX) */ * from DIANXIN where end_date=?");ps.setString(1, "20180503212649");ResultSet rs = ps.executeQuery();while (rs.next()) {String mdn = rs.getString("mdn");String start_date = rs.getString("start_date");String end_date = rs.getString("end_date");String x = rs.getString("x");String y = rs.getString("y");String county = rs.getString("county");System.out.println(mdn + "\t" + start_date + "\t" + end_date + "\t" + x + "\t" + y + "\t" + county);}ps.close();conn.close();

Hbase索引( Phoenix二级索引)相关推荐

  1. HBase phoenix二级索引

    1. 为什么需要用二级索引? 对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄.对于较大的表 ...

  2. 2021年大数据HBase(十二):Apache Phoenix 二级索引

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Apache Phoenix 二级索引 一.索引分类 ...

  3. Phoenix二级索引那些事儿(下)

    http://www.icaijing.com/hot/article4940159/ Phoenix二级索引那些事儿(下) 作者:中兴大数据| 发表时间:2015-7-30 03:31:18 索引配 ...

  4. HBase的协处理器(Coprocessor)、HBase如何使用二级索引、observer协处理器、 endpoint协处理器、Hbase 协处理器加载方式

    HBase的协处理器(Coprocessor).HBase不可以使用二级索引吗? 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立"二级索引" 难以执 行求 ...

  5. HBase+Solr 的 二级索引 实时查询

    零.概述 1.Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase S ...

  6. HBase协处理器及二级索引

    前言 在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求.在这种情况下,协处理器( ...

  7. MySQL的一级索引和二级索引介绍,HBase中提到的二级索引【笔记自用】

    1.一级索引 索引和数据存储在一起,都存储在同一个B+tree中的叶子节点.一般主键索引都是一级索引. 2.二级索引 二级索引树的叶子节点存储的是主键而不是数据.也就是说,在找到索引后,得到对应的主键 ...

  8. Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引

    hbase-day05 1.bulkLoad实现批量导入 优点: 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 "Bul ...

  9. mysql InnoDB 聚集索引,二级索引

    InnoDB 索引分为聚集索引(聚簇索引)与二级索引. 聚集索引: 1: 全表唯一且必有一个,主键索引属于聚集索引. 2: 索引项的顺序就是表中数据记录的物理顺序. 3: 若定义了主键索引InnoDB ...

最新文章

  1. CVPR 2020 | 元学习人脸识别框架详解
  2. debian linux 内核 3.14-1 显示器 很暗,Ubuntu 与 Linux Mint 用户安装 Kernel 3.14.1 内核
  3. mysql改为sql_项目需求变更:Mysql改为SqlServer
  4. python已经取代了excel_Python已经取代Excel?网友:笑了
  5. jQuery实现分页
  6. Ubuntu 中改变文件的默认打开方式(转)
  7. 先天性脑部发育异常_儿童脑发育不良的3大“诱因”,若孩子出现这5种异常,要警惕...
  8. 视差滚动不适合网页的5个原因
  9. 【连载】Django入门到实战(一)
  10. 【Java】为什么java构造函数的构造器只能在第一行写this() 或者super() ?
  11. Mysql数据备份与mysqldump增量备份
  12. 拓端tecdat|R语言探索BRFSS数据可视化
  13. 三星线刷工具Odin3_V3.12.7
  14. 使用rufus制作windows系统安装u盘
  15. 【经典】对static关键字深入理解
  16. 设置ubuntu1920*1080分辨率
  17. ArcGIS10.8安装包以及教程
  18. CentOS 6.8安装Docker V1.0
  19. 分号的html文本,在Vue中利用v-HTML按分号将文本换行的例子_輕微_前端开发者
  20. Vue3通过npm或者yarn启动后,显示“Network: use --host to expose”,无法访问

热门文章

  1. 数据结构04:静态链表
  2. 人手一个 Midjourney,StableStudio 重磅开源!
  3. python操作网页flash视频_Python爬取FLASH播放器中的资料
  4. GIMPS梅森素数搜寻及相关算法综述
  5. js 判断时间戳是否为同一天
  6. 中国典型的四大骨干网络及其IP地址范围
  7. c语言 黑盒测试,Nextdate函数的黑盒测试
  8. linux忽略abort信号,ARM Linux Data Abort 异常处理流程
  9. 本地和服务器导出Excel报“Microsoft Office Excel 不能访问文件” 解决方法
  10. SQL Server 2012导入Excel文件时 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序