之前的文章介绍了如何在CDH5和CDH6中分别安装phoenix4和phoenix5:
CDH6.2中使用parcel离线安装Phoenix5.0.0
CDH5.14集群下Phoenix4.14.0安装及性能对比phoenix/impala/hive
本篇内容介绍一下如何使用Phoenix映射hbase创建表和视图以及注意事项。
首先进入命令行模式,使用!tables查看当前的表,效果等同于hbase里的list和rdbms里的show tables;
/opt/cloudera/parcels/PHOENIX/bin/phoenix-sqlline hbase节点1,hbase节点2,hbase节点3..
在hbase中插入数据,查看Phoenix的表是否有数据,建phoenix的视图和表请参考下面的3,4,5,6,7小节。
对hbase的表进行插入和更新操作,查看phoenix的视图。
映射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
);
示例在第二步已贴。
映射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的数据。
创建在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中创建一张同名表。
默认不开启此映射,未开启映射hbase表空间的情况下,在phoenix中无法创建映射hbase表的视图或表,因为hbase在表空间下的表名中带有冒号,而phoenix中的表名无法使用冒号,即使在phoenix中建一个schema.table也无法成功映射到hbase表。因此我们需要开启映射hbase表空间的功能。
在CM中配置hbase的hbase-site的服务端和客户端参数:
phoenix.schema.isNamespaceMappingEnabled
true
重启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" ...
在第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的二级索引