天天看點

Phoenix表映射# HBase資料表仍為ZLXX:WT_TRADE_REFUND# 映射到表ZLXX:WT_TRADE_REFUND的視圖都先删除掉# 建立映射表(完美)并查詢資料# 在HBase表裡更新一條資料試試看Phoenix有沒有及時更新# 需要注意的問題,可以使用to_number,性能需要額外測試# 建議最好還是表建立、資料寫入和資料查詢都從Phoenix這個口子完成

Phoenix定位為OLTP和操作型分析(operational analytics),大多用于線上業務,穩定性要求第一位。Phoenix的功能很強大,也很靈活,Phoenix SQL基于SQL-92标準,但是還是有很多方言,使用時需要特别注意。

基礎軟體版本:

Apache Hadoop:hadoop-2.8.5

Apache HBase:hbase-1.4.10

Apache Phoenix:phoenix-4.14.3-HBase-1.4-bin

Phoenix版本支援:

Phoenix Current release 4.15.0 can run on Apache HBase 1.3, 1.4 and 1.5. CDH HBase 5.11, 5.12, 5.13 and 5.14 is supported by 4.14.0. Apache HBase 2.0 is supported by 5.0.0.

進入hbase用戶端

hbase shell

進入phoenix用戶端

phoenix-4.14.3-HBase-1.4-bin/bin/sqlline.py

Phoenix視圖映射

# HBase資料表仍為ZLXX:WT_TRADE_REFUND

# 映射到表ZLXX:WT_TRADE_REFUND的視圖都先删除掉

0: jdbc:phoenix:> drop view if exists zlxx.wt_trade_refund;              No rows affected (0.083 seconds)              0: jdbc:phoenix:> drop view if exists zlxx.wt_trade_refusumnd2;              No rows affected (0.023 seconds)
           

# 建立映射表(完美)并查詢資料

前面視圖删除之後,并不會影響hbase shell建立的表裡面的資料​​​​​​​

create table ZLXX.WT_TRADE_REFUND (              id varchar primary key,              info.trade_id varchar,              info.amount  varchar,              info.status varchar,              info.modify_time varchar              ) column_encoded_bytes=0;
           

執行效果:​​​​​​​

0: jdbc:phoenix:> create table ZLXX.WT_TRADE_REFUND (              . . . . . . . . >     id varchar primary key,              . . . . . . . . >     info.trade_id varchar,              . . . . . . . . >     info.amount  varchar,              . . . . . . . . >     info.status varchar,              . . . . . . . . >     info.modify_time varchar              . . . . . . . . > ) column_encoded_bytes=0;              529 rows affected (6.181 seconds)
           

查詢資料試試看(limit 5):​​​​​​​

0: jdbc:phoenix:> select * from ZLXX.WT_TRADE_REFUND limit 5;              +----------+------------+---------+---------+-----------------+              |    ID    |  TRADE_ID  | AMOUNT  | STATUS  |   MODIFY_TIME   |              +----------+------------+---------+---------+-----------------+              | 1005528  | T12059592  | 100     | 01      | 20200228185803  |              | 1005529  | T12059591  | 10      | 03      | 20200228185846  |              | 1005530  | T12059606  | 10      | 01      | 20200228195442  |              | 1005531  | T12059605  | 10      | 01      | 20200228195442  |              | 1005532  | noTradeId  | 100     | 03      | 20200229224015  |              +----------+------------+---------+---------+-----------------+              5 rows selected (0.052 seconds)
           

使用某個字段如id進行查詢(primary key):​​​​​​​

0: jdbc:phoenix:> select * from ZLXX.WT_TRADE_REFUND where id='2009999';              +----------+-------------+---------+---------+-----------------+              |    ID    |  TRADE_ID   | AMOUNT  | STATUS  |   MODIFY_TIME   |              +----------+-------------+---------+---------+-----------------+              | 2009999  | ZXR3099999  | 100     | 00      | 20200715124015  |              +----------+-------------+---------+---------+-----------------+              1 row selected (0.044 seconds)
           

簡單檢視一下Phoenix表中繼資料資訊:

TABLE_TYPE為TABLE​​​​​​​

0: jdbc:phoenix:> !tables              +------------+--------------+------------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+--+              | TABLE_CAT  | TABLE_SCHEM  |    TABLE_NAME    |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABLE_ROWS  | SALT_BUCKETS  |  |              +------------+--------------+------------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+--+              |            | SYSTEM       | CATALOG          | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          |  |              |            | SYSTEM       | FUNCTION         | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          |  |              |            | SYSTEM       | LOG              | SYSTEM TABLE  |          |            |                            |                 |              | true            | 32            |  |              |            | SYSTEM       | SEQUENCE         | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          |  |              |            | SYSTEM       | STATS            | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          |  |              |            | ZLXX         | WT_TRADE_REFUND  | TABLE         |          |            |                            |                 |              | false           | null          |  |              +------------+--------------+------------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+--+
           

# 在HBase表裡更新一條資料試試看Phoenix有沒有及時更新

走hbase shell用戶端put一條新資料

Phoenix表映射# HBase資料表仍為ZLXX:WT_TRADE_REFUND# 映射到表ZLXX:WT_TRADE_REFUND的視圖都先删除掉# 建立映射表(完美)并查詢資料# 在HBase表裡更新一條資料試試看Phoenix有沒有及時更新# 需要注意的問題,可以使用to_number,性能需要額外測試# 建議最好還是表建立、資料寫入和資料查詢都從Phoenix這個口子完成

走Phoenix這邊使用剛剛put的資料id查一查

Phoenix表映射# HBase資料表仍為ZLXX:WT_TRADE_REFUND# 映射到表ZLXX:WT_TRADE_REFUND的視圖都先删除掉# 建立映射表(完美)并查詢資料# 在HBase表裡更新一條資料試試看Phoenix有沒有及時更新# 需要注意的問題,可以使用to_number,性能需要額外測試# 建議最好還是表建立、資料寫入和資料查詢都從Phoenix這個口子完成

# 需要注意的問題,可以使用to_number,性能需要額外測試

上面映射的時候所有字段都是字元串,也就是varchar。

顯然在進行sum等聚合計算的時候,非數字類型會報錯。​​​​​​​

0: jdbc:phoenix:> select sum(amount) from zlxx.wt_trade_refund;              Error: ERROR 203 (22005): Type mismatch. expected: [DECIMAL] but was: VARCHAR at SUM argument 1 (state=22005,code=203)              org.apache.phoenix.schema.ArgumentTypeMismatchException: ERROR 203 (22005): Type mismatch. expected: [DECIMAL] but was: VARCHAR at SUM argument 1
           

如果映射的時候,資料類型為decimal,也會有問題,就是byte編碼問題會導緻Phoenix這邊字段值的精度有問題,比如HBase這邊字段值為0,Phoenix這邊會變成-1.02020202020201E+126。

使用to_number函數:​​​​​​​

0: jdbc:phoenix:> select sum(to_number(amount)) from zlxx.wt_trade_refund;              +------------------------------+              | SUM(TO_NUMBER(INFO.AMOUNT))  |              +------------------------------+              | 11730.14                     |              +------------------------------+              1 row selected (0.049 seconds)
           

# 建議最好還是表建立、資料寫入和資料查詢都從Phoenix這個口子完成

附錄hbase整合Phoenix的基本配置:​​​​​​​

hbase-site.xml              <property>              <name>phoenix.schema.isNamespaceMappingEnabled</name>              <value>true</value>              </property>              <property>              <name>phoenix.schema.mapSystemTablesToNamespace</name>              <value>true</value>              </property>
           

【Phoenix表映射到HBase表、END】

往期推薦:

Phoenix視圖映射

Kafka消息送達語義說明

Kafka基礎知識總結

Hadoop YARN:ApplicationMaster向ResourceManager注冊AM源碼調試

Apache Hadoop YARN:Client<-->ResourceManager源碼解析

Apache Hadoop YARN:Client<-->ResourceManager源碼DEBUG

Hadoop YARN:ApplicationMaster與ResourceManager互動源碼解析

Hive企業級調優

HiveQL查詢連續三天有銷售記錄的店鋪

HiveQL實戰螞蟻森林低碳使用者排名分析:解法一

HiveQL實戰螞蟻森林低碳使用者排名分析:解法二

HiveQL實戰螞蟻森林植物申領統計分析

Hive-函數

Hive-查詢

Hive-DML(Data Manipulation Language)資料操作語言

Hive-DDL(Data Definition Language)資料定義

Hive優化(整理版)

Spark Core之Shuffle解析

資料倉庫開發規範

Phoenix表映射# HBase資料表仍為ZLXX:WT_TRADE_REFUND# 映射到表ZLXX:WT_TRADE_REFUND的視圖都先删除掉# 建立映射表(完美)并查詢資料# 在HBase表裡更新一條資料試試看Phoenix有沒有及時更新# 需要注意的問題,可以使用to_number,性能需要額外測試# 建議最好還是表建立、資料寫入和資料查詢都從Phoenix這個口子完成