大数据技术之HBase5
6.3、Phoenix二级索引
6.3.1、二级索引配置文件
如果要用二级索引的话就需要添加如下配置到HBase的HRegionserver节点的hbase-site.xml。
6.3.2、全局索引(globalindex)
GlobalIndex是默认的索引格式,创建全局索引时,会在HBase中建立一张新表。也就是说索引数据和数据表是存放在不同的表中的,因此全局索引适用于多读少写的业务场景。
写数据的时候会消耗大量开销,因为索引表也要更新,而索引表是分布在不同的数据节点上的,跨节点的数据传输带来了较大的性能消耗。
在读数据的时候Phoenix会选择索引表来降低查询消耗的时间。
创建单个字段的全局索引。
CREATEINDEXmy_indexONmy_table(my_col);#例如0:jdbc:phoenix:hadoop102,hadoop103,hadoop104>createindexmy_indexonstudent1(age);
#删除索引DROPINDEXmy_indexONmy_table0:jdbc:phoenix:hadoop102,hadoop103,hadoop104>dropindexmy_indexonstudent1;
查看二级索引是否有效,可以使用explain查看执行计划,有二级索引之后会变成范围扫描
如果想查询的字段不是索引字段的话索引表不会被使用,也就是说不会带来查询速度的提升。
若想解决上述问题,可采用如下方案:
(1)使用包含索引
(2)使用本地索引
6.3.3、包含索引(coveredindex)
创建携带其他字段的全局索引(本质还是全局索引)。
语法:CREATEINDEXmy_indexONmy_table(v1)INCLUDE(v2);
骚戴理解:其中v1是索引列,v2是包含索引列,看下面的例子就懂了!
先删除之前的索引:0:jdbc:phoenix:hadoop102,hadoop103,hadoop104>dropindexmy_indexonstudent1;#创建包含索引0:jdbc:phoenix:hadoop102,hadoop103,hadoop104>createindexmy_indexonstudent1(age)include(addr);
之后使用执行计划查看效果
6.3.4、本地索引(localindex)
LocalIndex适用于写操作频繁的场景。
索引数据和数据表的数据是存放在同一张表中(且是同一个Region),避免了在写操作的时候往不同服务器的索引表中写索引带来的额外开销。
CREATELOCALINDEXmy_indexONmy_table(my_column);//my_column可以是多个。
本地索引会将所有的信息存在一个影子列族中,虽然读取的时候也是范围扫描,但是没有全局索引快,优点在于不用写多个表了。
#删除之前的索引0:jdbc:phoenix:hadoop102,hadoop103,hadoop104>dropindexmy_indexonstudent1;#创建本地索引0:jdbc:phoenix:hadoop102,hadoop103,hadoop104>CREATELOCALINDEXmy_indexONstudent1(age,addr);
#使用执行计划
7.1、使用场景
如果大量的数据已经存放在HBase上面,需要对已经存在的数据进行数据分析处理,那
么Phoenix并不适合做特别复杂的SQL处理,此时可以使用hive映射HBase的表格,之后
写HQL进行分析处理。
7.2、HBase与Hive集成使用
在hive-site.xml中添加zookeeper的属性,如下:
1)案例一
目标:建立Hive表,关联HBase表,插入数据到Hive表的同时能够影响HBase表。
分步实现:
(1)在Hive中创建表同时关联HBase
CREATETABLEhive_hbase_emp_table(empnoint,enamestring,jobstring,mgrint,hiredatestring,saldouble,commdouble,deptnoint)STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITHSERDEPROPERTIES("hbase.columns.mapping"=":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")TBLPROPERTIES("hbase.table.name"="hbase_emp_table");
骚戴理解:STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'表示以HBase存储数据
("hbase.columns.mapping"=":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:co
mm,info:deptno")
和
empnoint,enamestring,jobstring,mgrint,hiredatestring,saldouble,commdouble,deptnoint
是一一对应的!
提示:完成之后,可以分别进入Hive和HBase查看,都生成了对应的表。
(2)在Hive中创建临时中间表,用于load文件中的数据
提示:不能将数据直接load进Hive所关联HBase的那张表中。
CREATETABLEemp(empnoint,enamestring,jobstring,mgrint,hiredatestring,saldouble,commdouble,deptnoint)rowformatdelimitedfieldsterminatedby'\t';
(3)向Hive中间表中load数据
hive>loaddatalocalinpath'/opt/software/emp.txt'intotableemp;
(4)通过insert命令将中间表中的数据导入到Hive关联Hbase的那张表中
hive>insertintotablehive_hbase_emp_tableselect*fromemp;
(5)查看Hive以及关联的HBase表中是否已经成功的同步插入了数据
hive>select*fromhive_hbase_emp_table;
Hbase>scan'hbase_emp_table'
2)案例二
目标:在HBase中已经存储了某一张表hbase_emp_table,然后在Hive中创建一个外部
表来关联HBase中的hbase_emp_table这张表,使之可以借助Hive来分析HBase这张表中
的数据。
注:该案例2紧跟案例1的脚步,所以完成此案例前,请先完成案例1。
分步实现:
(1)在Hive中创建外部表
CREATEEXTERNALTABLErelevance_hbase_emp(empnoint,enamestring,jobstring,mgrint,hiredatestring,saldouble,commdouble,deptnoint)STOREDBY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITHSERDEPROPERTIES("hbase.columns.mapping"=":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")TBLPROPERTIES("hbase.table.name"="hbase_emp_table");
(2)关联后就可以使用Hive函数进行一些分析操作了
hive(default)>selectdeptno,avg(sal)moneryfromrelevance_hbase_empgroupbydeptno;