Hbase索引( Phoenix二级索引)
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二级索引)相关推荐
- HBase phoenix二级索引
1. 为什么需要用二级索引? 对于HBase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄.对于较大的表 ...
- 2021年大数据HBase(十二):Apache Phoenix 二级索引
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 Apache Phoenix 二级索引 一.索引分类 ...
- Phoenix二级索引那些事儿(下)
http://www.icaijing.com/hot/article4940159/ Phoenix二级索引那些事儿(下) 作者:中兴大数据| 发表时间:2015-7-30 03:31:18 索引配 ...
- HBase的协处理器(Coprocessor)、HBase如何使用二级索引、observer协处理器、 endpoint协处理器、Hbase 协处理器加载方式
HBase的协处理器(Coprocessor).HBase不可以使用二级索引吗? 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立"二级索引" 难以执 行求 ...
- HBase+Solr 的 二级索引 实时查询
零.概述 1.Hbase适用于大表的存储,通过单一的RowKey查询虽然能快速查询,但是对于复杂查询,尤其分页.查询总数等,实现方案浪费计算资源,所以可以针对hbase数据创建二级索引(Hbase S ...
- HBase协处理器及二级索引
前言 在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求.在这种情况下,协处理器( ...
- MySQL的一级索引和二级索引介绍,HBase中提到的二级索引【笔记自用】
1.一级索引 索引和数据存储在一起,都存储在同一个B+tree中的叶子节点.一般主键索引都是一级索引. 2.二级索引 二级索引树的叶子节点存储的是主键而不是数据.也就是说,在找到索引后,得到对应的主键 ...
- Hbase-day05_bulkLoad实现批量导入_HBase中rowkey的设计_二级索引_Phoenix二级索引
hbase-day05 1.bulkLoad实现批量导入 优点: 如果我们一次性入库hbase巨量数据,处理速度慢不说,还特别占用Region资源, 一个比较高效便捷的方法就是使用 "Bul ...
- mysql InnoDB 聚集索引,二级索引
InnoDB 索引分为聚集索引(聚簇索引)与二级索引. 聚集索引: 1: 全表唯一且必有一个,主键索引属于聚集索引. 2: 索引项的顺序就是表中数据记录的物理顺序. 3: 若定义了主键索引InnoDB ...
最新文章
- CVPR 2020 | 元学习人脸识别框架详解
- debian linux 内核 3.14-1 显示器 很暗,Ubuntu 与 Linux Mint 用户安装 Kernel 3.14.1 内核
- mysql改为sql_项目需求变更:Mysql改为SqlServer
- python已经取代了excel_Python已经取代Excel?网友:笑了
- jQuery实现分页
- Ubuntu 中改变文件的默认打开方式(转)
- 先天性脑部发育异常_儿童脑发育不良的3大“诱因”,若孩子出现这5种异常,要警惕...
- 视差滚动不适合网页的5个原因
- 【连载】Django入门到实战(一)
- 【Java】为什么java构造函数的构造器只能在第一行写this() 或者super() ?
- Mysql数据备份与mysqldump增量备份
- 拓端tecdat|R语言探索BRFSS数据可视化
- 三星线刷工具Odin3_V3.12.7
- 使用rufus制作windows系统安装u盘
- 【经典】对static关键字深入理解
- 设置ubuntu1920*1080分辨率
- ArcGIS10.8安装包以及教程
- CentOS 6.8安装Docker V1.0
- 分号的html文本,在Vue中利用v-HTML按分号将文本换行的例子_輕微_前端开发者
- Vue3通过npm或者yarn启动后,显示“Network: use --host to expose”,无法访问
热门文章
- 数据结构04:静态链表
- 人手一个 Midjourney,StableStudio 重磅开源!
- python操作网页flash视频_Python爬取FLASH播放器中的资料
- GIMPS梅森素数搜寻及相关算法综述
- js 判断时间戳是否为同一天
- 中国典型的四大骨干网络及其IP地址范围
- c语言 黑盒测试,Nextdate函数的黑盒测试
- linux忽略abort信号,ARM Linux Data Abort 异常处理流程
- 本地和服务器导出Excel报“Microsoft Office Excel 不能访问文件” 解决方法
- SQL Server 2012导入Excel文件时 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序