HBase系列(八)Phoenix操作HBase

一、Phoenix简介

Hbase适合存储大量的对关系运算要求低的NOSQL数据,受Hbase 设计上的限制不能直接使用原生的PAI执行在关系数据库中普遍使用的条件判断和聚合等操作。
Apache Phoenix 是 HBase 的 SQL 驱动。Phoenix 使得 HBase 支持通过 JDBC 的方式进行访问,并将你的 SQL 查询转成 HBase 的扫描和相应的动作。Phoenix 基于Hbase给面向业务的开发人员提供了以标准SQL的方式对Hbase进行查询操作,并支持标准SQL中大部分特性:条件运算,分组,分页,等高级查询语法。

二、安装部署

  • Apache Phoenix官网下载安装包:apache-phoenix-4.15.0-HBase-1.3-bin.tar.gz
  • 解压直 "/opt/"目录下
  • 复制Phoenix目录下phoenix-4.15.0-HBase-1.3-server.jar到HBase安装目录lib目录中
  • 复制HBase配置文件hbase.site.xml文件到Phoenix安装目录lib下
  • 重启HBase

三、Phoenix实操

访问Phoenix

一般使用以下三种方式访问Phoenix:

  • Linux Shell
  • JDBC API
  • 使用Python编写的命令行工具(sqlline, sqlline-thin和psql等)
  • SQuirrel

Linux Shell

  1. 进入
 bin/sqlline.py localhost:2181
  1. 退出
0: jdbc:phoenix:localhost:2181> !quit
或
0: jdbc:phoenix:localhost:2181> !exit
  1. 创建表格
    注意:
  • Hbase中表名和列族名是大小写敏感的,如果使用小写的表名那么必须加上双引号。
  • 从v4.8.0之前,所有的表(有模式的和没模式的)都在默认的命名空间中创建。v4.8.0之后用户可以将其模式映射到命名空间,这样用模式创建的任何表都将在Hbase的相应命名空间中创建。
  • 3在phoenix中与hbase的命名空间相对应的是schema概念,默认是没有开启的,需要在hbase的hbase-site.xml中增加以下配置项:
<property>
 <name>phoenix.schema.isNamespaceMappingEnabled</name>
 <value>true</value>
</property>
<property>
 <name>phoenix.schema.mapSystemTablesToNamespace</name>
 <value>true</value>
</property>
  • Phoenix表的管理维护通过Phoenix创建的表,必须指定primary key(对应Hbase的rowkey),列最好指定列族名称,列类型最好指定为varchar。
  • 在Phoenix中字段的类型所保存的byte数组和HBase中用Bytes工具了转换的byte数组可能会对不上,比如Bytes.toBytes(1)的结果和Phoenix中定义为INTEGER类的byte[]就不一样。因为Phoenix中的INTEGER是带符号的,要用无符号的话需要定义UNSIGNED_INT类型,UNSIGENT_INT类型的byte[]值和Bytes.toBytes(1)是一样的,但是UNSIGENT_INT无法存负数。
    所以如果直接定义INTEGER类型的话是不能直接简单地用Bytes.toBytes来转换得到的,由于这种情况的存在就不能直接操作HBase然后直接在Phoenix查看,反之亦然。

一种情况:HBase中无表数据
这种情况由Phoenix来映射表,在Phoenix中创建的表删除时HBase中的表也会删除。

0: jdbc:phoenix:localhost:2181> create table "user_info"("id" varchar primary key,"base_info"."name" varchar(10),"base_info"."age" varchar,"base_info"."gender" char(1),"extra_info"."province" varchar(20), "extra_info"."city" varchar(30)) column_encoded_bytes=0;

一种情况:HBase已存在表
如果只需要查询数据,不需要对数据进行操作
这时需要创建视图,因为视图删除时不会影响到源数据
建映射视图和映射表需要遵循以下几点:

  • Phoneix的表名必须和 hbase的 库名.表名一致
  • Phoneix的表的主键的列名一般对应rowkey列,名称可以随意,但是类型得匹配!
  • Phoneix的表的普通的列名,必须和hbase的列族.列名一致!
  • 表映射的结尾,必须添加column_encoded_bytes=0,不然无法从hbase中查询到数据的!
create view if not exists "user_info"(
"id" varchar primary key,
"base_info"."name" varchar,
"base_info"."age" varchar
)column_encoded_bytes=0;

如果需要对数据进行操作,只能用映射表来操作

create table if not exists "user_info"(
"id" varchar primary key,
"base_info"."name" varchar,
"base_info"."age" varchar
)column_encoded_bytes=0;
  1. 删除表格
    删除表格的时候遇到一个BUG,明明表是存在到,删除时提示:Error: ERROR 1012 (42M03): Table undefined. tableName=shanchuan.user_info (state=42M03,code=1012),重新创建同名表,又会提示表存在:Error: ERROR 1013 (42M04): Table already exists. tableName=shanchuan.user_info (state=42M04,code=1013)。再次删除才可以将表删除
    需要在HBase端先删除表格,然后在Phoenix中查询下该表出现提示不存在到时候,再删除表就不报错:
0: jdbc:phoenix:localhost:2181> drop table "user_info"
  1. 查看所有表
0: jdbc:phoenix:localhost:2181> !tables
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+----+
| TABLE_CAT  
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值