Phoenix使用

简介

Phoenix是构建在HBase上的一个SQL层,采用JAVA语言编写,为Hbase提供JDBC驱动,可通过标准的JDBC API来操作Hbase。Phoenix的查询引擎会将SQL查询语句转换成一个或多个HBase Scanner,且并行执行生成标准的JDBC结果集。

 

Phoenix的SQL实现原理主要是基于一系列的Scan操作来完成,Scan是HBase的批量扫描过程。这一系列的Scan操作也是分散到各台RegionServer上通过Coprocessor(hbase的协处理器)来完成。主要用到的是RegionObserver(endpoint ,类似关系型数据库中的存储过程,客户端可调用执行一段Server端代码,并将Server端代码结果返回给客户端进一步处理,如常见聚合操作),通过RegionObserver在postScannerOpen Hook中将RegionScanner替换成支持聚合操作的定制化Scanner,在真正执行聚合时,会通过自定的Scan属性传递给RegionScanner,在这个Scan中也可加入一些过滤规则,尽量减少返回Client的结果。

 

 

Phoenix与Hbase集成

Phoenix是以JDBC驱动方式嵌入到HBase中的,在部署时只需将Phoenix中的一个jar包直接放HBase的lib目录下即可。

下载phoenix   http://phoenix.apache.org/download.html

 

解压包,将phoenix目录下的 phoenix-HBase-server.jar拷贝至Hbase的lib目录下。重启Hbase后,会在Hbase中自动创建系统表,用于存储phoenix相关信息。此时可通过标准的JDBC来操作Hbase。

 

Phoenix提供了sqlline.py脚本用于启动Phoenix客户端并进行连接,启动时只需要指定HBase连接的Zookeeper集群地址即可。

 

Phoenix与Hbase表映射

Phoenix将HBase的数据模型映射到关系型世界。通过Phoenix创建表时会自动调用HBase客户端创建相应的表,并且在SYSTEM.CATALOG系统表中记录Phoenix创建表时的元数据,其主键的值对应HBase的RowKey,非主键的列对应HBase的Column(列族不指定时为0)

如果是通过Hbase API创建的表则不能通过phoenix访问该表,因为SYSTEM.CATALOG表中并没有维护Phoenix创建表的元数据。要想通过phoenix访问时,需创建映射,即添加表的元数据到SYSTEM.CATALOG系统表。

 

1、创建表

CREATE TABLE IF NOT EXISTS 表名(

  列名(rowkey) 类型 主键,

  列簇.列名,

  列簇.列名

)

 

2、创建视图(只读)

CREATE VIEW 视图名(

  列名(rowkey) 类型 主键,

  列簇.列名,

  列簇.列名

)

 

 

使用JDBC API操作Hbase

 

<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-core</artifactId>
    <version>4.13.1-HBase-1.2</version>
</dependency>

 

 

Phoenix中的SQL

Phoenix的SQL中如果表名、字段名不使用双引号标注那么默认转换成大写。

Phoenix中的字符串使用单引号进行标注。 

1、创建表:

对于Phoenix来说,HBase的rowkey会被转换成primary key,column family如果不指定则为0否则字段名会带上,qualifier转换成表的字段名,如下是创建一个Phoenix表的例子,以创建表test_01为例,主键为ROW即为HBase的rowkey, column family为cf1, qualifier为name、age、sex。

 

create table "test_01" (

    "ROW" varchar primary key,  -- 设置为主键 将对应hbase中的rowkey

"cf1"."name" varchar ,

"cf1"."age" varchar,

"cf1"."sex" varchar

)

 

2、插入/更新数据

  由于hbase中只有put操作,所以插入和更新都使用upsert,需要更新时以原来的主键(rowkey)插入数据覆盖旧值,这里覆盖后的数据无法在查询出来,即Phoenix不支持hbase的多版本特性。

   upsert into "test_01"("ROW","cf1"."name","cf1"."age" ,"cf1"."sex") values('1', 'admin', '25','13')

 

3、查询数据

 

4、组合primary key

Phoenix还支持组合primary key,即由多个字段联合组成主键,对于组合主键来说,在HBase底层会把主键的多个字段组合成rowkey显示,其它字段为HBase的qualifier显示。如test_02表,假设row和name为主键,创建表语句又变成:

create table "test_02" (

"ROW" varchar,

"name" varchar ,

"cf1"."age" varchar,

"cf1"."sex" varchar,

    constraint pk PRIMARY KEY("ROW","name")

)

  

此时插入一条记录:

 upsert into "test_02"("ROW","name","cf1"."age" ,"cf1"."sex") values('2', 'guest', '25','13')

Phoenix中数据:

 

hbase中rowkey的值为 row与name的组合:

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值