使用Phoenix映射hbase表创建表和视图

之前的文章介绍了如何在CDH5和CDH6中分别安装phoenix4和phoenix5:

CDH6.2中使用parcel离线安装Phoenix5.0.0

CDH5.14集群下Phoenix4.14.0安装及性能对比phoenix/impala/hive

本篇内容介绍一下如何使用Phoenix映射hbase创建表和视图以及注意事项。

1. 进入命令行模式

首先进入命令行模式,使用!tables查看当前的表,效果等同于hbase里的list和rdbms里的show tables;

/opt/cloudera/parcels/PHOENIX/bin/phoenix-sqlline hbase节点1,hbase节点2,hbase节点3..

2. 验证Phoenix

在hbase中插入数据,查看Phoenix的表是否有数据,建phoenix的视图和表请参考下面的3,4,5,6,7小节。

对hbase的表进行插入和更新操作,查看phoenix的视图。

3. 创建phoenix视图映射hbase表

映射hbase中已有的表为phoenix的视图,在这个模式下,通过phoenix可以以SQL的形式只读hbase的表。删除视图后,hbase的表仍存在。视图名称需要和hbase表名称一致。

phoenix的DDL中建议为所有表名和列名加上双引号,否则phoenix会全部转为大写进行识别,同样的在执行phoenix的查询命令时要给字符串用单引号,因为双引号里的会被识别为列或表或列族。

其中ROW是主键,对应hbase表的rowkey,其他字段使用"列族"."列名"作为字段名。

若hbase表中的列名包含小数点,如如列族为'cf',列名为"root.a.b" 则在Phoenix的DDL中对应为"cf"."root.a.b" varchar,

create view "phoenix_test"( 
"ROW" varchar primary key, 
"cf1"."name"  varchar,
"cf1"."age"  varchar
);

示例在第二步已贴。

4. 创建phoenix表映射hbase已有的表

映射hbase中已有的表为phoenix的表,在这个模式下,通过phoenix可以以SQL的形式对hbase表进行DDL和DML的操作,删除phoenix表后,hbase里对应的表也会被删除。

在Phoenix中映射hbase中已有的表,若hbase表未使用namespace命名空间则可以使用create table "hbase表名"()...;创建phoenix表,若hbase表在namespace中即表名中带有冒号,则需要参考下面的第6点里的配置开启phoenix的映射hbase表空间,此时可以使用命令create table "hbase表命名空间"."hbase表名"()...创建phoenix的表.

 create table "phoenix"."phoenix_test"(
"ROW" varchar primary key,
"cf1"."name"  varchar,
"cf1"."age"  varchar
 );

此时创建的phoenix表看不到hbase中已有的数据,但若hbase表有新增数据或对phoenix表进行增删改查则可以看到hbase里的增量数据,这个是因为phoenix4.10版本之后对列映射编码规则做了修改:官方文档

我们可以通过在DDL最后加上一句column_encoded_bytes=0即可关闭该配置,然后该phoenxi表创建之后就可以看到hbase钟的已有数据了:

create table "phoenix"."phoenix_test"( 
"ROW" varchar primary key, 
"cf1"."name"  varchar,
"cf1"."age"  varchar
)
column_encoded_bytes=0;

例:先准备一张hbase表并插入数据,在phoenix中建table,禁用列映射编码规则后,可以直接查到hbase的数据。

 

5. 创建Phoenix表

创建在hbase中不存在的phoenix的表,会自动在hbase中创建一个同名hbase表,此时等于第三点里的效果,可以对该hbase表做DML和DDL操作,且删除phoenix表之后,hbase的表也会被删除。

 create table "phoenix"."phoenix_test2"(
"ROW" varchar primary key,
"cf1"."name"  varchar,
"cf1"."age"  varchar
 );

执行DDL前若hbase中不存在phoenix_test2表,则在执行phoenix的ddl后会在hbase中创建一张同名表。

6. 映射hbase表空间

默认不开启此映射,未开启映射hbase表空间的情况下,在phoenix中无法创建映射hbase表的视图或表,因为hbase在表空间下的表名中带有冒号,而phoenix中的表名无法使用冒号,即使在phoenix中建一个schema.table也无法成功映射到hbase表。因此我们需要开启映射hbase表空间的功能。

在CM中配置hbase的hbase-site的服务端和客户端参数:

<property>
<name>phoenix.schema.isNamespaceMappingEnabled</name>
<value>true</value>
</property> 

 重启hbase之后,使用如下命令建带有命名空间的hbase表的phoenix视图或表:

首先建schema(与hbase命名空间同名),然后使用create view/table  "命名空间/schema"."hbase表名" (...);

 create view "phoenix"."phoenix_test"(
"ROW" varchar primary key,
"cf1"."name"  varchar,
"cf1"."age"  varchar
 );

 开启此配置后,若hbase表名中带有'.' 点分隔,则phoenix的DDL中需要使用引号全包起来create view "abc.efg" ...

未开启此配置时,若hbase表名中带有'.' 点分隔,则phoenix的DDL中需要使用引号分别包起来create view "abc"."efg" ...

7. 禁用列映射规则

在第4步中有提到,默认DDL创建的phoenix表看不到hbase中已有的数据,但若hbase表有新增数据或对phoenix表进行增删改查则可以看到hbase里的增量数据,这个是因为phoenix4.10版本之后对列映射编码规则做了修改:官方文档

我们可以通过在DDL最后加上一句column_encoded_bytes=0即可关闭该配置,然后该phoenxi表创建之后就可以看到hbase钟的已有数据了:

create table "phoenix"."phoenix_test"( 
"ROW" varchar primary key, 
"cf1"."name"  varchar,
"cf1"."age"  varchar
)
column_encoded_bytes=0;

之前提到phoenix的一个特点是支持二级索引,下一篇介绍如何创建并使用phoenix的二级索引

猜你喜欢

转载自blog.csdn.net/wsdc0521/article/details/106057703