使用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的二級索引

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章