1.准备
大家可以从官网上下载与HBase版本对应的Phoenix版本。对应到HBase 2.1,应该使用版本「5.0.0-HBase-2.0」。
http://phoenix.apache.org/download.html
2安装
tar -zxvf apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz -C /export/server/
2. 将phoenix的所有jar包添加到所有HBase RegionServer和Master的复制到HBase的lib目录
cp phoenix*.jar /export/server/hbase-2.1.0/lib/
vim hbase-site.xml
# 1. 将以下配置添加到 hbase-site.xml 后边
<!-- 支持HBase命名空间映射 -->
<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property>
<!-- 支持索引预写日志编码 -->
<property>
<name>hbase.regionserver.wal.codec</name>
<value>org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec</value>
</property>
4. 将配置后的hbase-site.xml拷贝到phoenix的bin目录
cp hbase-site.xml /export/server/phoenix-5.0.0-HBase-2.0/bin/
5.配置环境变量
export PHOENIX_HOME=/export/server/phoenix-5.0.0-HBase-2.0
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
6.建立连接
bin/sqlline.py node1,node2,node3:2181
注意phoenix中默认小写回转为大写如果想写小写请使用”” 号,使用是也必须是”” 号,建议使用大写另外需要注意的是insert 数据字符串要用’ ‘号
3常见命令
!table
1.建表
create table if not exists t_order(
id varchar(20) primary key,
C1.status varchar(10),
C1.money float,
C1.pay_way integer,
C1.user_id varchar(10)
);
upsert into t_order(id,status,money) values ('111','1',220.0);
delete from t_order where id='8888';
select * from t_order;
分页查询
select * from t_order limit 3 offset 2; #offset 起始索引 limit 后面是查询数量
4phoenix预分区
1预分区方式 #注意压缩方式字母必须大写否则不生效
create table if not exists t_order(
id varchar(20) primary key,
C1.status varchar(10),
C1.money float,
C1.pay_way integer,
C1.user_id varchar(10)
)
COMPRESSION='GZ',
split on ('1','2','3');
2.加盐hash方式
create table if not exists t_order(
id varchar(20) primary key,
C1.status varchar(10),
C1.money float,
C1.pay_way integer,
C1.user_id varchar(10)
)
COMPRESSION='GZ',
salt_buckets=5;
加盐就在是rowkey的开头加0X* 通过phoenix查询时会自动去盐
5.phoenix视图
通过非Phoenix创建的表,phoenix看不到,所以如果想在phoenix中操作的话需要创建视图。
#小写需要加 "" 号,大写可以不处理
create view "momo"."region_test" (
rowkey varchar primary key,
"cf1"."name" varchar(20));
create view water_bill(
C1.LATEST_DATE varchar(10),
C1.NAME varchar(10),
C1.NUM_CURRENT varchar(10),
C1.NUM_PREVIOUS varchar(10),
C1.NUM_USAGE varchar(10),
C1.PAY_DATE varchar(10),
C1.RECORD_DATE varchar(10),
C1.SEX varchar(10),
C1.TOTAL_MONEY integer
);
6.Phoenix二级索引
6.1索引的分类
- 全局索引: phoenix会单独创建一个索引表。因此适合多读少些。索引表和目标表有相同的region数。查询时只能有索引字段出现非索引字段索引失效
语法: create index 索引名称 on 表名(列名1, 列名2 ….)
- 本地索引:不会单独创建一个索引表,索引数据直接放置到数据中,适合写多场景。查询时只要查询的字段中存在索引字段就可以生效,加盐分区会造成索引失效
语法:create local index 索引名称 on 表名(列名1, 列名2 ….)
覆盖索引:可以为表中任意字段创建索引,建立索引后该数据将在索引字段后有效减少去主表查询。但是会浪费空间,因为在索引字段后所以依赖本地索引或者全局索引
语法:create [local] index my_index on 目标表(列1,列2...) include(覆盖索引列....)
函数索引:准对函数的结果创建索引当我们使用这个函数时直接返回结果
语法:create index 索引名称 on 表名(函数)
6.2索引使用案例
6.2.1全局索引+覆盖索引
#只创建user_id 字段全局索引 发现explain 查询任然时全表扫描
create index ORDER_DTL_INDEX_ID on order_dtl(user_id);
#删除索引
drop index ORDER_DTL_INDEX_ID on order_dtl;
#重新创建cluser_id 的全局索引并且传经id, money的覆盖索引,再次explain 发现变为RANGE SCAN
create index ORDER_DTL_INDEX_ID on order_dtl(user_id)include(id, money);
6.2.2本地索引
在未来可能会根据表中 订单ID, 订单状态, 支付金额, 支付方式, 用户ID查询数据,由于字段较多因此建立本地索引较为合适
create local index local_index_order_dtl on order_dtl(id,status,money,pay_way,user_id);
explain select user_id,category from order_dtl where user_id='3107867';
explain select user_id,category from order_dtl where status='已支付';