Phoenix的搭建和使用

Phoenix詳細的信息可以查看: 官網     |     apache/phoenix |     Download     |     Performance     |     支持的SQL語法


CDH6中集成的HBase版本爲2.1.0+cdh6.2.0 ,我們從官方的鏡像資源下載列表中看到最新的CDH支持到cdh5.14.2的版本,這種版本的直接有一個parcels包,可以通過Cloudera Manager的parcel頁面添加資源,來安裝組件。

通過查看源碼git branch -a可以看到 remotes/origin/5.x-cdh6 分支,但在源碼編譯安裝時這個分支還不完整,編譯出來時會缺少一些包,因此我們直接嘗試安裝v5.0.0-HBase-2.0版本的Phoenix,安裝方式有兩種,第一種直接下載官方編譯好的 apache-phoenix-5.0.0-HBase-2.0apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz;第二種是通過編譯源碼的方式來安裝。這裏我們直接使用源碼編譯來進行安裝。


目錄


1 Installation

1.1 源碼編譯

# clone源碼
git clone https://github.com/apache/phoenix.git
# 進入源碼根目錄
cd phoenix/
# 查看tag ,或者查看分支 git branch -a
git tag
# 選擇一個版本,進入其分支,或者切換到某個分支:git checkout -b remotes/origin/5.x-cdh6
git checkout tags/v5.0.0-HBase-2.0
# 編譯
mvn -T2C install -DskipTests

如果編譯時報如下錯誤:

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:14 min (Wall Clock)
[INFO] Finished at: 2019-07-15T13:57:32+08:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.2.0:compile (scala-compile-first) on project phoenix-spark: wrap: org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :phoenix-spark

可以看到是phoenix-spark模塊的net.alchim31.maven:scala-maven-plugin:3.2.0插件編譯時發生了錯誤,我們可以將其原有的scala-maven-plugin註釋掉,修改爲如下,然後重新編譯:

<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <version>3.2.2</version>
    <executions>
        <execution>
            <goals>
                <goal>compile</goal>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

編譯成功後如下:

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for Apache Phoenix 5.0.0-HBase-2.0:
[INFO]
[INFO] Apache Phoenix ..................................... SUCCESS [  9.616 s]
[INFO] Phoenix Core ....................................... SUCCESS [03:34 min]
[INFO] Phoenix - Flume .................................... SUCCESS [01:56 min]
[INFO] Phoenix - Kafka .................................... SUCCESS [01:33 min]
[INFO] Phoenix - Pig ...................................... SUCCESS [04:59 min]
[INFO] Phoenix Query Server Client ........................ SUCCESS [ 48.315 s]
[INFO] Phoenix Query Server ............................... SUCCESS [07:59 min]
[INFO] Phoenix - Pherf .................................... SUCCESS [  8.362 s]
[INFO] Phoenix - Spark .................................... SUCCESS [09:20 min]
[INFO] Phoenix - Hive ..................................... SUCCESS [57:28 min]
[INFO] Phoenix Client ..................................... SUCCESS [01:20 min]
[INFO] Phoenix Server ..................................... SUCCESS [ 37.906 s]
[INFO] Phoenix Assembly ................................... SUCCESS [ 19.902 s]
[INFO] Phoenix - Tracing Web Application .................. SUCCESS [  9.255 s]
[INFO] Phoenix Load Balancer .............................. SUCCESS [ 19.176 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:01 h (Wall Clock)
[INFO] Finished at: 2019-07-07T11:09:10+08:00
[INFO] ------------------------------------------------------------------------

1.2 安裝

將編譯成功的phoenix-assembly/target/phoenix-5.0.0-HBase-2.0.tar.gz包拷貝到Phoenix的安裝節點,然後解壓

cp phoenix-assembly/target/phoenix-5.0.0-HBase-2.0.tar.gz /opt/
cd /opt
tar -zxf phoenix-5.0.0-HBase-2.0.tar.gz
cd phoenix-5.0.0-HBase-2.0

此時爲了方便可以配置下環境變量

vim ~/.bash_profile
# 添加如下配置,並保存退出

export PHOENIX_HOME=/opt/phoenix-5.0.0-HBase-2.0
export PATH=$PATH:$PHOENIX_HOME/bin

接下來將Phoenix根目錄下的phoenix-5.0.0-HBase-2.0-*.jar 包分發到每個RegionServer的lib下

scp phoenix-5.0.0-HBase-2.0-*.jar root@cdh3:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/lib/
scp phoenix-5.0.0-HBase-2.0-*.jar root@cdh2:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/lib/
scp phoenix-5.0.0-HBase-2.0-*.jar root@cdh1:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/lib/

這裏最好也將phoenix-5.0.0-HBase-2.0-client.jar拷貝到Phoenix安裝的根目錄下

cp phoenix-client/target/phoenix-5.0.0-HBase-2.0-client.jar $PHOENIX_HOME/

1.3 Cloudera Manager 的配置

登陸Cloudera Manager頁面,然後修改HBase配置,進入配置頁面後搜索hbase-site.xml 的 HBase 服務高級配置代碼段,然後添加如下配置,然後重啓 HBase 使配置生效。

<property>
<name>hbase.table.sanity.checks</name>
<value>false</value>
</property>

HBase設置配置項

2 Using

進入Phoenix的命令行執行

# 後面跟的參數爲HBase配置的ZK的地址
sqlline.py cdh2:2181

2.1 NoClassDefFoundError解決

如果進入Phoenix終端時報如下錯誤:

Error: org.apache.phoenix.exception.PhoenixIOException: org.apache.hadoop.hbase.DoNotRetryIOException: java.lang.NoClassDefFoundError: org/apache/htrace/Trace
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:469)
        at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:130)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:324)
        at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:304)
Caused by: java.lang.NoClassDefFoundError: org/apache/htrace/Trace
        at org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.overrideDelegate(BaseScannerRegionObserver.java:222)
        at org.apache.phoenix.coprocessor.BaseScannerRegionObserver$RegionScannerHolder.nextRaw(BaseScannerRegionObserver.java:273)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3134)
        at org.apache.hadoop.hbase.regionserver.RSRpcServices.scan(RSRpcServices.java:3383)
        at org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ClientService$2.callBlockingMethod(ClientProtos.java:42002)
        at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:413)
        ... 3 more
Caused by: java.lang.ClassNotFoundException: org.apache.htrace.Trace
        at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 9 more (state=08000,code=101)

可以看到提示缺少org.apache.htrace.Trace類,因此我們需要將htrace-core-3.2.0-incubating.jar拷貝到HBase的lib下:

# CDH環境下已經有這個包了,這裏直接將其拷貝到HBase的lib下(每個RegionServer)
# 如果沒有可以直接下載這包到HBase的lib下: wget https://repo1.maven.org/maven2/org/apache/htrace/htrace-core/3.2.0-incubating/htrace-core-3.2.0-incubating.jar
cp /opt/cloudera/cm/lib/cdh5/htrace-core-3.2.0-incubating.jar  /opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/lib/hbase/lib/

注意: 如果依舊提示缺少這個包,則需要重啓HBase服務

再次進入

[root@cdh3 phoenix-5.0.0-HBase-2.0]# bin/sqlline.py cdh2
Setting property: [incremental, false]
Setting property: [isolation, TRANSACTION_READ_COMMITTED]
issuing: !connect jdbc:phoenix:cdh2 none none org.apache.phoenix.jdbc.PhoenixDriver
Connecting to jdbc:phoenix:cdh2
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/phoenix-5.0.0-HBase-2.0/phoenix-5.0.0-HBase-2.0-client.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/cloudera/parcels/CDH-6.2.0-1.cdh6.2.0.p0.967373/jars/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Connected to: Phoenix (version 5.0)
Driver: PhoenixEmbeddedDriver (version 5.0)
Autocommit status: true
Transaction isolation: TRANSACTION_READ_COMMITTED
Building list of tables and columns for tab-completion (set fastconnect to true to skip)...
133/133 (100%) Done
Done
sqlline version 1.2.0
0: jdbc:phoenix:cdh2> !tables
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+---------------+-----------------+------------+-------------+----------------+-------------+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE_NAME  | SELF_REFERENCING_COL_NAME  | REF_GENERATION  | INDEX_STATE  | IMMUTABLE_ROWS  | SALT_BUCKETS  | MULTI_TENANT  | VIEW_STATEMENT  | VIEW_TYPE  | INDEX_TYPE  | TRANSACTIONAL  | IS_NAMESPAC |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+---------------+-----------------+------------+-------------+----------------+-------------+
|            | SYSTEM       | CATALOG     | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false         |                 |            |             | false          | false       |
|            | SYSTEM       | FUNCTION    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false         |                 |            |             | false          | false       |
|            | SYSTEM       | LOG         | SYSTEM TABLE  |          |            |                            |                 |              | true            | 32            | false         |                 |            |             | false          | false       |
|            | SYSTEM       | SEQUENCE    | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false         |                 |            |             | false          | false       |
|            | SYSTEM       | STATS       | SYSTEM TABLE  |          |            |                            |                 |              | false           | null          | false         |                 |            |             | false          | false       |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+---------------+---------------+-----------------+------------+-------------+----------------+-------------+

2.2 原有HBase表的映射同步

Phoenix對錶和列名都是區分大小寫的,如果不加雙引號默認爲大寫。通過上面可以看到HBase原有的表並沒有列出來,這是因爲 Phoenix 無法自動識別 HBase 中原有的表,所以需要將 HBase 中已有的做映射,才能夠被 Phoenix 識別並操作。

-- 其實也就是使用CREATE語句重新創建表來映射
--   注意1:建表時一定注意大小寫,如果原表小寫,記得用雙引號,主鍵最好大寫
--   注意2:建表時不推薦使用太複雜的數據類型,爲了安全的映射放置出錯,先使用varchar,
--         否則會出現精度或者格式上的誤差,例如時間日期類,整數型長度,小數型精度等
--   注意3:記得加上 COLUMN_ENCODED_BYTES 否則可能類名解析無法對應到HBase的類,
--           詳細說明查看 http://phoenix.apache.org/columnencoding.html
--   注意4:如果是創建的表來映射,在Phoenix刪除表,HBase的表和數據也會刪除,注意數據不要誤刪了
--   
--   推薦:我這裏映射的是表,如果只用來做查詢,最好創建一個視圖來來映射:只需要將 TABLE 改爲 VIEW 
0: jdbc:phoenix:cdh2:2181> CREATE TABLE "m_info" (
. . . . . . . . . . . . .> "ROW" varchar primary key,
. . . . . . . . . . . . .> "cf1"."gc" double ,
. . . . . . . . . . . . .> "cf1"."id" bigint ,
. . . . . . . . . . . . .> "cf1"."jd" double ,
. . . . . . . . . . . . .> "cf1"."name" varchar ,
. . . . . . . . . . . . .> "cf1"."wd" double
. . . . . . . . . . . . .> )column_encoded_bytes=0;
1 row affected (7.282 seconds)

-- 查詢數據
0: jdbc:phoenix:cdh2> select * from "m_info" ;
+------+-----------------------+-----------------------+-----------------------+-------+-------------------------+
| ROW  |          gc           |          id           |          jd           | name  |           wd            |
+------+-----------------------+-----------------------+-----------------------+-------+-------------------------+
| 2    | 1.1                   | 2                     | 3.33                  | 名字1  | 5.1234                  |
+------+-----------------------+-----------------------+-----------------------+-------+-------------------------+

2.3 查看錶信息和插入數據

-- 查看錶結構
0: jdbc:phoenix:cdh2:2181> !describe "m_info";
+------------+--------------+-------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+-------------+----------------+-------------------+--------------------+-------------------+---+
| TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  | COLUMN_NAME  | DATA_TYPE  | TYPE_NAME  | COLUMN_SIZE  | BUFFER_LENGTH  | DECIMAL_DIGITS  | NUM_PREC_RADIX  | NULLABLE  | REMARKS  | COLUMN_DEF  | SQL_DATA_TYPE  | SQL_DATETIME_SUB  | CHAR_OCTET_LENGTH  | ORDINAL_POSITION  | I |
+------------+--------------+-------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+-------------+----------------+-------------------+--------------------+-------------------+---+
|            |              | m_info      | ROW          | 12         | VARCHAR    | null         | null           | null            | null            | 0         |          |             | null           | null              | null               | 1                 | f |
|            |              | m_info      | gc           | 8          | DOUBLE     | null         | null           | null            | null            | 1         |          |             | null           | null              | null               | 2                 | t |
|            |              | m_info      | id           | -5         | BIGINT     | null         | null           | null            | null            | 1         |          |             | null           | null              | null               | 3                 | t |
|            |              | m_info      | jd           | 8          | DOUBLE     | null         | null           | null            | null            | 1         |          |             | null           | null              | null               | 4                 | t |
|            |              | m_info      | name         | 12         | VARCHAR    | null         | null           | null            | null            | 1         |          |             | null           | null              | null               | 5                 | t |
|            |              | m_info      | wd           | 8          | DOUBLE     | null         | null           | null            | null            | 1         |          |             | null           | null              | null               | 6                 | t |
+------------+--------------+-------------+--------------+------------+------------+--------------+----------------+-----------------+-----------------+-----------+----------+-------------+----------------+-------------------+--------------------+-------------------+---+

-- 插入數據。這裏注意的是value中的值如果是字符串,必須用單引號
0: jdbc:phoenix:cdh2:2181> UPSERT INTO "m_info"("ROW", "gc", "id", "jd", "name", "wd") VALUES('2', 1.1, 2, 3.33, '名字1', 5.1234);
1 row affected (1.074 seconds)

2.4 數據類型

Data Types

字段類型 映射的類 值的範圍 佔用字節
INTEGER java.lang.Integer -2147483648 到 2147483647 4字節
UNSIGNED_INT java.lang.Integer 0 到 2147483647 4字節
BIGINT java.lang.Long -9223372036854775808 到 9223372036854775807 8字節
UNSIGNED_LONG java.lang.Long 0 到 9223372036854775807 8字節
TINYINT java.lang.Byte -128 到 127 1字節
UNSIGNED_TINYINT java.lang.Byte 0 到 127 1字節
SMALLINT java.lang.Short -32768 到 32767 2字節
UNSIGNED_SMALLINT java.lang.Short 0 到 32767 2字節
FLOAT java.lang.Float -3.402823466 E + 38 到 3.402823466 E + 38 4字節
UNSIGNED_FLOAT java.lang.Float 0到3.402823466 E + 38 4字節
DOUBLE java.lang.Double -1.7976931348623158 E + 308 到 1.7976931348623158 E + 308 8字節
UNSIGNED_DOUBLE java.lang.Double 0 到 1.7976931348623158 E + 308 8字節
DECIMAL 或 DECIMAL(precisionInt , scaleInt) java.math.BigDecimal 最大精度爲38位。可變長度
BOOLEAN java.lang.Boolean 0表示false,1表示true 1字節
TIME java.sql.Time 自紀元以來的毫秒數(基於時間GMT) 8字節
UNSIGNED_TIME java.sql.Time 格式爲 yyyy-MM-dd hh:mm:ss 8字節
DATE java.sql.Date 自紀元以來的毫秒數(基於時間GMT) 8字節
UNSIGNED_DATE java.sql.Date 格式爲 yyyy-MM-dd hh:mm:ss 8字節
TIMESTAMP java.sql.Timestamp 自紀元以來的毫秒數(基於時間GMT) 12字節(紀元時間長8字節加納秒的4字節整數)
UNSIGNED_TIMESTAMP java.sql.Timestamp 格式爲 yyyy-MM-dd hh:mm:ss[.nnnnnnnnn] 12字節
VARCHAR 或 VARCHAR(precisionInt) java.lang.String 可選的最大字節長度
CHAR(precisionInt) java.lang.String 固定長度字符串
BINARY(precisionInt) byte[] 原始固定長度字節數組
VARBINARY byte[] 原始可變長度字節數組
ARRAY 或 ARRAY[dimensionInt] java.sql.Array

2.5 修改表信息

首先Phoenix對字段的映射的元數據信息如下,下面修改字段類型時可以由此進行修改

DATA_TYPE TYPE_NAME
INTEGER 4
UNSIGNED_INT 4
BIGINT -5
UNSIGNED_LONG -5
TINYINT -6
UNSIGNED_TINYINT -6
SMALLINT 5
UNSIGNED_SMALLINT 5
FLOAT 6
UNSIGNED_FLOAT 6
DOUBLE 8
UNSIGNED_DOUBLE 8
DECIMAL 3
BOOLEAN 16
TIME 92
UNSIGNED_TIME 92
DATE 91
UNSIGNED_DATE 91
TIMESTAMP 93
UNSIGNED_TIMESTAMP 93
VARCHAR 12
CHAR 1
BINARY -2
VARBINARY -3
0: jdbc:phoenix:cdh2> CREATE TABLE "test" (
. . . . . . . . . . > "ROW" varchar primary key,
. . . . . . . . . . > "info1"."age" UNSIGNED_TINYINT ,
. . . . . . . . . . > "info1"."name" varchar ,
. . . . . . . . . . > "info1"."property" double
. . . . . . . . . . > )column_encoded_bytes=0;
3 rows affected (8.962 seconds)
-- 查看錶中的字段信息
0: jdbc:phoenix:cdh2> select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE,DECIMAL_DIGITS from SYSTEM.CATALOG where TABLE_NAME='test';
+------------+--------------+-------------+--------------+----------------+------------+--------------+-----------------+
| TENANT_ID  | TABLE_SCHEM  | TABLE_NAME  | COLUMN_NAME  | COLUMN_FAMILY  | DATA_TYPE  | COLUMN_SIZE  | DECIMAL_DIGITS  |
+------------+--------------+-------------+--------------+----------------+------------+--------------+-----------------+
|            |              | test        |              |                | null       | null         | null            |
|            |              | test        | ROW          |                | 12         | null         | null            |
|            |              | test        | age          | info1          | -6         | null         | null            |
|            |              | test        | name         | info1          | 12         | null         | null            |
|            |              | test        | property     | info1          | 8          | null         | null            |
+------------+--------------+-------------+--------------+----------------+------------+--------------+-----------------+
5 rows selected (0.064 seconds)
-- 將name的varchar類型的長度調整爲 32,前4個字段爲主鍵
5 rows selected (0.064 seconds)
0: jdbc:phoenix:cdh2> upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,COLUMN_SIZE) values('','','test','name','info1',32);
1 row affected (0.493 seconds)
0: jdbc:phoenix:cdh2> upsert into SYSTEM.CATALOG (TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE) values('','','test','age','info1',-5);
1 row affected (0.019 seconds)
0: jdbc:phoenix:cdh2> select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,DATA_TYPE,COLUMN_SIZE,DECIMAL_DIGITS from SYSTEM.CATALOG where TABLE_NAME='test';
+------------+--------------+-------------+--------------+----------------+------------+--------------+-----------------+
| TENANT_ID  | TABLE_SCHEM  | TABLE_NAME  | COLUMN_NAME  | COLUMN_FAMILY  | DATA_TYPE  | COLUMN_SIZE  | DECIMAL_DIGITS  |
+------------+--------------+-------------+--------------+----------------+------------+--------------+-----------------+
|            |              | test        |              |                | null       | null         | null            |
|            |              | test        | ROW          |                | 12         | null         | null            |
|            |              | test        | age          | info1          | -5         | null         | null            |
|            |              | test        | name         | info1          | 12         | 32           | null            |
|            |              | test        | property     | info1          | 8          | null         | null            |
+------------+--------------+-------------+--------------+----------------+------------+--------------+-----------------+
5 rows selected (0.039 seconds)

2.6 刪除庫

-- 如果HBase的數據和Phoenix的數據是同步的,則可以直接刪除SCHEM
0: jdbc:phoenix:cdh3> DROP SCHEMA IF EXISTS my_schema;

-- 如果不能刪除,可以先刪除HBase的表信息
hbase(main):003:0> disable "test.Person"
Took 0.5061 seconds
hbase(main):004:0> drop "test.Person"
Took 0.2915 seconds
-- 再清除Phoenix的數據
-- 查看CATALOG信息
0: jdbc:phoenix:cdh3> select TENANT_ID,TABLE_SCHEM,TABLE_NAME,COLUMN_NAME,COLUMN_FAMILY,TABLE_SEQ_NUM,TABLE_TYPE,PK_NAME from SYSTEM.CATALOG;
-- 刪除裏面的表信息
| TENANT_ID  | TABLE_SCHEM  | TABLE_NAME  |        COLUMN_NAME     | COLUMN_FAMILY  | TABLE_SEQ_NUM  | TABLE_TYPE  | PK_NAME  |
+------------+--------------+-------------+-------------------------------------+----------------+----------------+-------------+----------+
|            | ……           | ……          | ……                     |                | null           |             |          |
|            | test         | Person      |                        |                | 0              | u           |          |
|            | test         | Person      |                        | 0              | null           |             |          |
|            | test         | Person      | age                    | 0              | null           |             |          |
|            | test         | Person      | idcard_num             |                | null           |             |          |
|            | test         | Person      | name                   | 0              | null           |             |          |
+------------+--------------+-------------+------------------------+----------------+----------------+-------------+----------+
-- 刪除SCHEM信息
0: jdbc:phoenix:cdh3> DELETE FROM SYSTEM.CATALOG WHERE TABLE_SCHEM='test';
5 rows affected (0.352 seconds)
-- 再次使用 !tables 查看錶,發現庫以及表均已經成功刪除

2.7 執行SQL腳本

我們使用Phoenix自帶的樣例數據演示,數據在 $PHOENIX_HOME/examples,具體執行如下:

-- 1 查看數據和腳本,其中 $PHOENIX_HOME 是Phoenix安裝的目錄。
-- 可以看到有STOCK_SYMBOL數據文件和sql腳本、WEB_STAT數據文件和腳本文件
[root@cdh3 ~]# ls $PHOENIX_HOME/examples
pig  STOCK_SYMBOL.csv  STOCK_SYMBOL.sql  WEB_STAT.csv  WEB_STAT_QUERIES.sql  WEB_STAT.sql

-- 1.1 查看 STOCK_SYMBOL.sql。可以看到有三個SQL,分別爲建表SQL、更新插入一條數據SQL、查詢表數據SQL
[root@cdh3 ~]# cat $PHOENIX_HOME/examples/STOCK_SYMBOL.sql
CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);
UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');
SELECT * FROM STOCK_SYMBOL;

-- 1.2 查看 WEB_STAT.sql。可以看到這裏是一個建表SQL
[root@cdh3 ~]# cat  $PHOENIX_HOME/examples/WEB_STAT.sql
CREATE TABLE IF NOT EXISTS WEB_STAT (
     HOST CHAR(2) NOT NULL,
     DOMAIN VARCHAR NOT NULL,
     FEATURE VARCHAR NOT NULL,
     DATE DATE NOT NULL,
     USAGE.CORE BIGINT,
     USAGE.DB BIGINT,
     STATS.ACTIVE_VISITOR INTEGER
     CONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE)
);

-- 1.3 查看 WEB_STAT_QUERIES.sql。可以看到有三個查詢 SQL
[root@cdh3 ~]# cat $PHOENIX_HOME/examples/WEB_STAT_QUERIES.sql
SELECT DOMAIN, AVG(CORE) Average_CPU_Usage, AVG(DB) Average_DB_Usage
FROM WEB_STAT
GROUP BY DOMAIN
ORDER BY DOMAIN DESC;
-- Sum, Min and Max CPU usage by Salesforce grouped by day
SELECT TRUNC(DATE,'DAY') DAY, SUM(CORE) TOTAL_CPU_Usage, MIN(CORE) MIN_CPU_Usage, MAX(CORE) MAX_CPU_Usage
FROM WEB_STAT
WHERE DOMAIN LIKE 'Salesforce%'
GROUP BY TRUNC(DATE,'DAY');
-- list host and total active users when core CPU usage is 10X greater than DB usage
SELECT HOST, SUM(ACTIVE_VISITOR) TOTAL_ACTIVE_VISITORS
FROM WEB_STAT
WHERE DB > (CORE * 10)
GROUP BY HOST;


-- 2 執行自帶腳本
[root@cdh3 ~]#  $PHOENIX_HOME/bin/sqlline.py localhost $PHOENIX_HOME/examples/STOCK_SYMBOL.sql
148/148 (100%) Done
Done
1/4          CREATE TABLE IF NOT EXISTS STOCK_SYMBOL (SYMBOL VARCHAR NOT NULL PRIMARY KEY, COMPANY VARCHAR);
No rows affected (2.349 seconds)
2/4          UPSERT INTO STOCK_SYMBOL VALUES ('CRM','SalesForce.com');
1 row affected (0.162 seconds)
3/4          SELECT * FROM STOCK_SYMBOL;
+---------+-----------------+
| SYMBOL  |     COMPANY     |
+---------+-----------------+
| CRM     | SalesForce.com  |
+---------+-----------------+
1 row selected (0.038 seconds)
4/4
Closing: org.apache.phoenix.jdbc.PhoenixConnection
sqlline version 1.2.0


-- 也可以指定csv數據文件和執行sql腳本
[root@cdh3 ~]# psql.py localhost $PHOENIX_HOME/examples/WEB_STAT.sql $PHOENIX_HOME/examples/WEB_STAT.csv $PHOENIX_HOME/examples/WEB_STAT_QUERIES.sql
no rows upserted
Time: 2.709 sec(s)
csv columns from database.
CSV Upsert complete. 39 rows upserted
Time: 19.653 sec(s)
DOMAIN                                            AVERAGE_CPU_USAGE               AVERAGE_DB_USAGE
----------------------------- ------------------------------- --------------------------
Salesforce.com                                  260.727                                  257.636
Google.com                                       212.875                                   213.75
Apple.com                                        114.111                                  119.556
Time: 0.127 sec(s)
DAY                             TOTAL_CPU_USAGE                  MIN_CPU_USAGE                   MAX_CPU_USAGE
----------------------- -------------------- -------------------------- ----------------------------
2013-01-01 00:00:00.000                        35                            35                          35
2013-01-02 00:00:00.000                       150                            25                         125
2013-01-03 00:00:00.000                        88                            88                          88
2013-01-04 00:00:00.000                        26                             3                           23
2013-01-05 00:00:00.000                       550                            75                          475
2013-01-06 00:00:00.000                        12                            12                           12
2013-01-08 00:00:00.000                       345                            345                         345
2013-01-09 00:00:00.000                       390                            35                          355
2013-01-10 00:00:00.000                       345                            345                         345
2013-01-11 00:00:00.000                       335                            335                         335
2013-01-12 00:00:00.000                          5                              5                           5
2013-01-13 00:00:00.000                       355                            355                         355
2013-01-14 00:00:00.000                          5                              5                           5
2013-01-15 00:00:00.000                       720                            65                          655
2013-01-16 00:00:00.000                       785                            785                         785
2013-01-17 00:00:00.000                      1590                            355                        1235
Time: 0.045 sec(s)
HO                    TOTAL_ACTIVE_VISITORS
-- ----------------------------------------
EU                                      150
NA                                        1
Time: 0.022 sec(s)

-- 3 登陸 Phoenix。也可以使用Squirrel工具
[root@cdh3 ~]#  $PHOENIX_HOME/bin/sqlline.py localhost

2.8 DDL語法

數據庫定義語言DDL(Data Definition Language)是我們在創建表的時候用到的一些SQL,比如說:CREATE、ALTER、DROP等。DDL主要是用在定義或改變表的結構,數據類型,表之間的鏈接和約束等初始化工作上。

-- 1 建表,建表的語句可以看 執行SQL腳本 中的如下兩個文件的建表語句
--  基本上和一般的SQL建表差不多,支持主鍵,支持 NOT NULL約束,這裏又不同的是,建表時可以在字段前加上列族名以區分字段信息 
$PHOENIX_HOME/examples/STOCK_SYMBOL.sql
$PHOENIX_HOME/examples/WEB_STAT.sql

-- 2 ALTER一個表,例如在STOCK_SYMBOL添加一列 name
0: jdbc:phoenix:localhost> ALTER TABLE STOCK_SYMBOL ADD "name" varchar(64);
No rows affected (0.749 seconds)
-- 再次查看錶數據,發現有多了一列name
0: jdbc:phoenix:localhost> SELECT * FROM STOCK_SYMBOL;
+---------+-----------------+-------+
| SYMBOL  |     COMPANY     | name  |
+---------+-----------------+-------+
| CRM     | SalesForce.com  |       |
+---------+-----------------+-------+
3 rows selected (0.15 seconds)

-- 3 ALTER一個表,刪除一列,例如將上一步在STOCK_SYMBOL表添加的name一列刪除
0: jdbc:phoenix:localhost> ALTER TABLE STOCK_SYMBOL DROP COLUMN "name";
No rows affected (0.605 seconds)
-- 再次查看錶數據,發現name這一列已經刪除
0: jdbc:phoenix:localhost> SELECT * FROM STOCK_SYMBOL;
+---------+-----------------+
| SYMBOL  |     COMPANY     |
+---------+-----------------+
| CRM     | SalesForce.com  |
+---------+-----------------+
3 rows selected (0.095 seconds)
-- 如果demo2 表是一個視圖,也可以將視圖中的某個列字段刪去,語法如下
0: jdbc:phoenix:localhost> ALTER VIEW "demo2" DROP COLUMN "comm";

-- 4 刪除庫
-- 4.1 如果HBase的數據和Phoenix的數據是同步的,則可以直接刪除SCHEM
0: jdbc:phoenix:cdh3> DROP SCHEMA IF EXISTS my_schema;

-- 4.2 如果不能刪除,可以先刪除HBase的表信息
hbase(main):003:0> disable "test.Person"
Took 0.5061 seconds
hbase(main):004:0> drop "test.Person"
Took 0.2915 seconds
-- 再清除Phoenix的數據
-- 4.3 刪除SCHEM信息
0: jdbc:phoenix:cdh3> DELETE FROM SYSTEM.CATALOG WHERE TABLE_SCHEM='test';
5 rows affected (0.352 seconds)
-- 再次使用 !tables 查看錶,發現庫以及表均已經成功刪除

2.8.1 加鹽表

在密碼學中,加鹽是指在散列之前將散列內容(例如:密碼)的任意固定位置插入特定的字符串。這個在散列中加入字符串的方式稱爲“加鹽”。其作用是讓加鹽後的散列結果和沒有加鹽的結果不相同,在不同的應用情景中,這個處理可以增加額外的安全性。而Phoenix中加鹽是指對pk對應的byte數組插入特定的byte數據。

加鹽能解決HBASE讀寫熱點問題,例如:單調遞增rowkey數據的持續寫入,使得負載集中在某一個RegionServer上引起的熱點問題。在創建表的時候指定屬性值:SALT_BUCKETS,其值表示所分buckets(region)數量, 範圍是1~256。

-- 加鹽表的創建格式如下
CREATE TABLE mytable (my_key VARCHAR PRIMARY KEY, col VARCHAR) SALT_BUCKETS = 8;

2.8.2 自增ID

現在有一個需求是這樣的,有一批書籍,需要對其進行編號存儲,要求編號要唯一,建表語句如下:

0: jdbc:phoenix:localhost> CREATE TABLE books(
. . . . . . . . . . . . .>  id INTEGER NOT NULL PRIMARY KEY,
. . . . . . . . . . . . .>  name VARCHAR,
. . . . . . . . . . . . .>  author VARCHAR
. . . . . . . . . . . . .> )SALT_BUCKETS = 8;
No rows affected (3.250 seconds)

我們接下來需要使用自增ID,來生成上表的id,但是使用這樣的自增ID,容易造成集羣的熱點問題,因此這裏在建表時通過加鹽的方式解決這個潛在的問題。下面是Phoenix中自增ID的語法,如下:

-- 自增ID的語法如下:
--   START 用於指定第一個值。如果不指定默認爲1.
--   INCREMENT指定每次調用NEXT VALUE FOR後自增大小。 如果不指定默認爲1。
--   MINVALUE和MAXVALUE一般與CYCLE連用, 讓自增數據形成一個環,從最小值到最大值,再從最大值到最小值。
--   CACHE默認爲100, 表示server端生成100個自增序列緩存在客戶端,可以減少rpc次數。
--        此值也可以通過phoenix.sequence.cacheSize來配置。
CREATE SEQUENCE [IF NOT EXISTS] SCHEMA.SEQUENCE_NAME
[START WITH number]
[INCREMENT BY number]
[MINVALUE number]
[MAXVALUE number]
[CYCLE]
[CACHE number]

現在我們使用這個語法創建自增序列,我們定初始值爲10000,自增間隔爲1,緩存大小爲1000,實現如下:

-- 1 創建自增序列
0: jdbc:phoenix:localhost> CREATE SEQUENCE book_sequence START WITH 10000 INCREMENT BY 1 CACHE 1000;
No rows affected (0.174 seconds)

-- 2 通過自增序列,寫入數據信息。這裏插入兩條數據,通過NEXT VALUE FOR 調用自增序列
0: jdbc:phoenix:localhost> UPSERT INTO books(id, name, author) VALUES( NEXT VALUE FOR 
. . . . . . . . . . . . .> book_sequence,'Effective JavaScript', 'David Herman');
1 row affected (0.085 seconds)
-- 插入第二條數據
0: jdbc:phoenix:localhost> UPSERT INTO books(id, name, author) VALUES( NEXT VALUE FOR 
. . . . . . . . . . . . .> book_sequence,'Speaking Javascript','Dr.Axel Rauschmayer');
1 row affected (0.014 seconds)

-- 3 查看書籍信息表。books沒有加引號時默認爲大寫。發現數據已成功插入,且其ID爲從10000以1位步長自增
0: jdbc:phoenix:localhost> SELECT * FROM BOOKS;
+--------+-----------------------+----------------------+
|   ID   |         NAME          |        AUTHOR        |
+--------+-----------------------+----------------------+
| 10001  | Speaking Javascript   | Dr.Axel Rauschmayer  |
| 10000  | Effective JavaScript  | David Herman         |
+--------+-----------------------+----------------------+
2 rows selected (0.245 seconds)

2.9 DML和DQL語法

數據操縱語言DML(Data Manipulation Language)主要對錶中的數據進行插入、刪除、修改的操作,在Phoenix對應的操作就是UPSERTDELETE。數據查詢語言DQL(Data Query Language)主要用於數據的查詢,在Phoenix對應的操作就是SELETE

-- 1 SELECT 。查詢 STOCK_SYMBOL 表數據,取其3條
0: jdbc:phoenix:localhost> SELECT * FROM WEB_STAT LIMIT 3;
+-------+-------------+------------+--------------------------+-------+------+-----------------+
| HOST  |   DOMAIN    |  FEATURE   |           DATE           | CORE  |  DB  | ACTIVE_VISITOR  |
+-------+-------------+------------+--------------------------+-------+------+-----------------+
| EU    | Apple.com   | Mac        | 2013-01-01 01:01:01.000  | 35    | 22   | 34              |
| EU    | Apple.com   | Store      | 2013-01-03 01:01:01.000  | 345   | 722  | 170             |
| EU    | Google.com  | Analytics  | 2013-01-13 08:06:01.000  | 25    | 2    | 6               |
+-------+-------------+------------+--------------------------+-------+------+-----------------+
3 rows selected (0.132 seconds)


-- 2 UPSERT。這個是需要注意的,因爲HBase本身的架構特點,沒有update語法,Phoenix的插入和修改統一爲 UPSERT 關鍵字。
--  2.1 插入一條數據,不指定字段,直接填寫插入的值,建表時有多少字段就要一一對應,不能漏
0: jdbc:phoenix:localhost> UPSERT INTO STOCK_SYMBOL VALUES('AAPL', 'APPLE Inc.');
1 row affected (0.355 seconds)

--  2.2 插入一條數據,可以只指定我們需要插入數據的字段,其它沒有約束時使用默認值
0: jdbc:phoenix:localhost> UPSERT INTO STOCK_SYMBOL(SYMBOL, COMPANY) VALUES('GOOG', 'Google');
1 row affected (0.009 seconds)

--  2.3 更新一條數據。結合主鍵使用UPSERT實現。
--  例如更新 WEB_STAT ,從建表語句可以看到其主鍵爲 HOST、DOMAIN、FEATURE、DATE,
--  將HOST='EU', DOMAIN='Apple.com', FEATURE='Mac', DATE='2013-01-01 01:01:01.000'的 ACTIVE_VISITOR改爲33
0: jdbc:phoenix:localhost> UPSERT INTO WEB_STAT(HOST, DOMAIN, FEATURE, DATE, ACTIVE_VISITOR) VALUES('EU', 'Apple.com', 'Mac', '2013-01-01 01:01:01.000', 33);
1 row affected (0.191 seconds)
--   查看結果。發現第一行數據的 ACTIVE_VISITOR 已經更新爲33了
0: jdbc:phoenix:localhost> SELECT * FROM WEB_STAT LIMIT 3;
+-------+-------------+------------+--------------------------+-------+------+-----------------+
| HOST  |   DOMAIN    |  FEATURE   |           DATE           | CORE  |  DB  | ACTIVE_VISITOR  |
+-------+-------------+------------+--------------------------+-------+------+-----------------+
| EU    | Apple.com   | Mac        | 2013-01-01 01:01:01.000  | 35    | 22   | 33              |
| EU    | Apple.com   | Store      | 2013-01-03 01:01:01.000  | 345   | 722  | 170             |
| EU    | Google.com  | Analytics  | 2013-01-13 08:06:01.000  | 25    | 2    | 6               |
+-------+-------------+------------+--------------------------+-------+------+-----------------+
3 rows selected (0.059 seconds)

-- 3統計不同域名(DOMAIN)下訪客數(ACTIVE_VISITOR)大於100的數據量
0: jdbc:phoenix:localhost> SELECT DOMAIN,COUNT(1) FROM WEB_STAT
. . . . . . . . . . . . .> WHERE ACTIVE_VISITOR>100 GROUP BY DOMAIN;
+-----------------+-----------+
|     DOMAIN      | COUNT(1)  |
+-----------------+-----------+
| Apple.com       | 3         |
| Google.com      | 1         |
| Salesforce.com  | 4         |
+-----------------+-----------+
3 rows selected (0.041 seconds)

-- 4 CASE,將常見的域名轉成中文,其它則返回原始內容
0: jdbc:phoenix:localhost> SELECT (CASE DOMAIN WHEN 'Apple.com' THEN '蘋果公司' 
. . . . . . . . . . . . .> WHEN 'Google.com' THEN '谷歌' 
. . . . . . . . . . . . .> ELSE DOMAIN END ) AS "域名" FROM WEB_STAT GROUP BY DOMAIN;
+-----------------+
|       域名        |
+-----------------+
| 蘋果公司            |
| 谷歌              |
| Salesforce.com  |
+-----------------+
3 rows selected (0.084 seconds)

-- 5 分頁查詢。結合order by ,排序字段最好爲主鍵。LIMIT語法如下
--   [ LIMIT { count } ]
--   [ OFFSET start [ ROW | ROWS ] ]
--   [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
--  例如接下來,我們對WEB_STAT表的數據按照活躍的訪客數(ACTIVE_VISITOR)倒序進行分頁,
   --  每頁顯示20條數據,從起始的第一條數據開始顯示。
--  LIMIT限制每頁顯示20條數據, OFFSET 爲第一次數據的起始偏移量
0: jdbc:phoenix:localhost> SELECT * FROM WEB_STAT ORDER BY ACTIVE_VISITOR DESC
. . . . . . . . . . . . .> LIMIT 20 OFFSET 0;
+-------+-----------------+------------+--------------------------+-------+-------+-----------------+
| HOST  |     DOMAIN      |  FEATURE   |           DATE           | CORE  |  DB   | ACTIVE_VISITOR  |
+-------+-----------------+------------+--------------------------+-------+-------+-----------------+
| NA    | Salesforce.com  | Reports    | 2013-01-09 17:36:01.000  | 355   | 432   | 315             |
| NA    | Salesforce.com  | Login      | 2013-01-17 02:20:01.000  | 1235  | 2422  | 243             |
| EU    | Google.com      | Search     | 2013-01-09 01:01:01.000  | 395   | 922   | 190             |
| EU    | Apple.com       | Store      | 2013-01-03 01:01:01.000  | 345   | 722   | 170             |
| NA    | Apple.com       | Mac        | 2013-01-02 04:01:01.000  | 345   | 255   | 155             |
| NA    | Salesforce.com  | Login      | 2013-01-10 01:01:01.000  | 345   | 252   | 150             |
| EU    | Salesforce.com  | Login      | 2013-01-12 01:01:01.000  | 5     | 62    | 150             |
| NA    | Apple.com       | Login      | 2013-01-04 01:01:01.000  | 135   | 2     | 110             |
| NA    | Google.com      | Search     | 2013-01-10 01:05:01.000  | 835   | 282   | 80              |
| NA    | Salesforce.com  | Login      | 2013-01-16 01:01:01.000  | 785   | 782   | 80              |
| NA    | Google.com      | Analytics  | 2013-01-07 06:01:01.000  | 23    | 1     | 57              |
| NA    | Google.com      | Analytics  | 2013-01-14 01:01:01.000  | 65    | 252   | 56              |
| EU    | Salesforce.com  | Reports    | 2013-01-05 04:14:12.000  | 475   | 252   | 53              |
| NA    | Google.com      | Search     | 2013-01-08 08:01:01.000  | 345   | 242   | 46              |
| NA    | Salesforce.com  | Reports    | 2013-01-15 07:09:01.000  | 655   | 426   | 46              |
| NA    | Salesforce.com  | Login      | 2013-01-04 11:01:11.000  | 23    | 56    | 45              |
| NA    | Salesforce.com  | Dashboard  | 2013-01-03 11:01:01.000  | 88    | 66    | 44              |
| EU    | Salesforce.com  | Dashboard  | 2013-01-06 05:04:05.000  | 12    | 22    | 43              |
| EU    | Salesforce.com  | Reports    | 2013-01-02 14:32:01.000  | 125   | 131   | 42              |
| NA    | Apple.com       | Login      | 2013-01-01 01:01:01.000  | 35    | 22    | 40              |
+-------+-----------------+------------+--------------------------+-------+-------+-----------------+
20 rows selected (0.24 seconds)
--  第二頁,LIMIT限制每頁顯示20條數據, OFFSET 指定爲20表示第二頁的數據的起始偏移量
0: jdbc:phoenix:localhost> SELECT * FROM WEB_STAT ORDER BY ACTIVE_VISITOR DESC
. . . . . . . . . . . . .> LIMIT 20 OFFSET 20;
+-------+-----------------+------------+--------------------------+-------+------+-----------------+
| HOST  |     DOMAIN      |  FEATURE   |           DATE           | CORE  |  DB  | ACTIVE_VISITOR  |
+-------+-----------------+------------+--------------------------+-------+------+-----------------+
| EU    | Apple.com       | Mac        | 2013-01-01 01:01:01.000  | 35    | 22   | 34              |
| NA    | Salesforce.com  | Login      | 2013-01-17 01:01:01.000  | 355   | 242  | 33              |
| NA    | Salesforce.com  | Dashboard  | 2013-01-11 01:01:01.000  | 335   | 32   | 30              |
| NA    | Apple.com       | iPad       | 2013-01-05 01:01:01.000  | 85    | 2    | 18              |
| NA    | Salesforce.com  | Reports    | 2013-01-09 16:33:01.000  | 35    | 42   | 15              |
| NA    | Apple.com       | iPad       | 2013-01-06 01:01:01.000  | 35    | 22   | 10              |
| NA    | Salesforce.com  | Login      | 2013-01-08 14:11:01.000  | 345   | 242  | 10              |
| NA    | Salesforce.com  | Login      | 2013-01-01 01:01:01.000  | 35    | 42   | 10              |
| NA    | Apple.com       | Mac        | 2013-01-08 01:01:01.000  | 3     | 2    | 10              |
| NA    | Salesforce.com  | Dashboard  | 2013-01-14 04:07:01.000  | 5     | 2    | 9               |
| NA    | Apple.com       | iPad       | 2013-01-07 01:01:01.000  | 9     | 27   | 7               |
| NA    | Google.com      | Analytics  | 2013-01-11 01:02:01.000  | 7     | 2    | 7               |
| NA    | Salesforce.com  | Reports    | 2013-01-15 04:09:01.000  | 65    | 26   | 6               |
| NA    | Google.com      | Search     | 2013-01-12 01:01:01.000  | 8     | 7    | 6               |
| EU    | Google.com      | Analytics  | 2013-01-13 08:06:01.000  | 25    | 2    | 6               |
| EU    | Salesforce.com  | Reports    | 2013-01-13 08:04:04.000  | 355   | 52   | 5               |
| EU    | Salesforce.com  | Reports    | 2013-01-05 03:11:12.000  | 75    | 22   | 3               |
| EU    | Salesforce.com  | Reports    | 2013-01-02 12:02:01.000  | 25    | 11   | 2               |
| NA    | Salesforce.com  | Login      | 2013-01-04 06:01:21.000  | 3     | 52   | 1               |
+-------+-----------------+------------+--------------------------+-------+------+-----------------+
19 rows selected (0.18 seconds)

-- 6 刪除數據。刪除時可以添加條件,也可以模糊匹配刪除
-- 爲了模擬,我們先添加兩條數據
0: jdbc:phoenix:localhost> UPSERT INTO STOCK_SYMBOL VALUES('WAG', 'Walgreens');
1 row affected (0.116 seconds)
0: jdbc:phoenix:localhost> UPSERT INTO STOCK_SYMBOL VALUES('WMT', 'Walmart');
1 row affected (0.008 seconds)
-- 6.1 刪除 SYMBOL='CRM'的一條數據
0: jdbc:phoenix:localhost> DELETE FROM STOCK_SYMBOL WHERE SYMBOL='CRM';
1 row affected (0.089 seconds)
--  發現已成功刪除
0: jdbc:phoenix:localhost>  SELECT * FROM STOCK_SYMBOL;
+---------+-------------+
| SYMBOL  |   COMPANY   |
+---------+-------------+
| AAPL    | APPLE Inc.  |
| GOOG    | Google      |
| WAG     | Walgreens   |
| WMT     | Walmart     |
+---------+-------------+
4 rows selected (0.022 seconds)

-- 6.2 刪除 COMPANY 爲Wal開頭的所有數據
0: jdbc:phoenix:localhost> DELETE FROM STOCK_SYMBOL WHERE COMPANY LIKE 'Wal%';
2 rows affected (0.034 seconds)
-- 發現有兩條滿足條件的數據已被刪除
0: jdbc:phoenix:localhost>  SELECT * FROM STOCK_SYMBOL;
+---------+-------------+
| SYMBOL  |   COMPANY   |
+---------+-------------+
| AAPL    | APPLE Inc.  |
| GOOG    | Google      |
+---------+-------------+
2 rows selected (0.017 seconds)

-- 6.3 刪除demo表,如果demo表不是視圖並,對一個的HBase的表和數據也會被刪除。
0: jdbc:phoenix:cdh3> DELETE TABLE "demo";

2.9.1 Join

Phoenix本身提供了Join功能,但比較適用於大表join 小表之類的簡單join,如果要做大表join大表的複雜分析可以藉助Spark來做。

官方文檔介紹中Phoenix支持Join類型如右圖所示有兩種,一種是內連接:INNER JOIN,一種是外連接:OUTER JOIN,其中OUTER JOIN支持LEFT和RIGHT兩種方式。但同時其還支持UNION ALL語法,可以合併來自多個SELECT語句的行數據。
Join Type

關於這幾種連接文氏圖(Venn diagram)如下所示,INNER JOIN 一般被譯作內連接,內連接查詢能將左表(表 A)和右表(表 B)中能關聯起來的數據連接後返回;LEFT JOIN 一般被譯作左連接,也寫作 LEFT OUTER JOIN ,左連接查詢會返回左表(表 A)中所有記錄,不管右表(表 B)中有沒有關聯的數據,在右表中找到的關聯數據列也會被一起返回;RIGHT JOIN 一般被譯作右連接,也寫作 RIGHT OUTER JOIN ,右連接查詢會返回右表(表 B)中所有記錄,不管左表(表 A)中有沒有關聯的數據,在左表中找到的關聯數據列也會被一起返回。FULL OUTER JOIN 一般被譯作外連接、全連接,實際查詢語句中可以寫作 FULL OUTER JOIN 或 FULL JOIN ,外連接查詢能返回左右表裏的所有記錄,其中左右表裏能關聯起來的記錄被連接後返回。
inner join & outer join
現在有兩張表,一個是網站數據表websites,主要記錄了網站主鍵id、名稱、連接、網站流量排名、國家等信息。另一張表爲訪問日誌表access_log,主要記錄的有每個網站每日的訪問數量,兩個表通過id來關聯,即websites.id=access_log.site_id ,現在我們通過Phoenix來分別演示INNER JOIN、LEFT [OUTER] JOIN、RIGHT [OUTER] JOIN、FULL [OUTER] JOIN(Phoenix雖然不支持,但可以通過UNION ALL 來實現),對兩個表進行關聯,並根據訪問數量降序排,輸出標識id、名稱、數量、日期。

-- 1 建表

--  1.1 Websites 表
0: jdbc:phoenix:> CREATE TABLE IF NOT EXISTS  TEST."websites" (
. . . . . . . . > "id" UNSIGNED_LONG NOT NULL PRIMARY KEY,
. . . . . . . . > "name" varchar(255) ,
. . . . . . . . > "url" varchar(255) ,
. . . . . . . . > "alexa" UNSIGNED_INT, /*'網站流量排名'*/
. . . . . . . . > "country" varchar(32) 
. . . . . . . . > );
No rows affected (0.954 seconds)

--  1.2 access_log 表
0: jdbc:phoenix:> CREATE TABLE IF NOT EXISTS TEST."access_log" (
. . . . . . . . > "aid" UNSIGNED_LONG NOT NULL,
. . . . . . . . > "site_id" UNSIGNED_LONG NOT NULL,
. . . . . . . . > "count" UNSIGNED_INT,
. . . . . . . . > "access_date" DATE ,
. . . . . . . . > CONSTRAINT PK PRIMARY KEY ("aid", "site_id")
. . . . . . . . > );
No rows affected (0.393 seconds)

--  1.3 查看創建的表。可以看到本次創建了SCHEM爲TEST的兩張表access_log、websites
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  | MULTI_TENANT  | VIEW_STATEMENT  | VIEW_TYPE  | INDEX_TYPE  | TRANSACTIONAL  | IS_NAMESPAC |
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+--------
|            | 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          | 
|            |               | BOOKS       | TABLE         |          |            |                            |                 |              | false           | 8             | 
|            |               | STOCK_SYMBOL | TABLE       |          |            |                            |                 |              | false           | null          | 
|            |               | WEB_STAT    | TABLE         |          |            |                            |                 |              | false           | null          | 
|            |               | demo        | TABLE         |          |            |                            |                 |              | false           | null          | 
|            | TEST         | access_log  | TABLE         |          |            |                            |                 |              | false           | null          | 
|            | TEST         | websites    | TABLE         |          |            |                            |                 |              | false           | null          | 
+------------+--------------+-------------+---------------+----------+------------+----------------------------+-----------------+--------------+-----------------+--------


-- 2 插入數據。注意:字符串一定用 單引號
--  2.1 插入 websites 表測試數據
0: jdbc:phoenix:> UPSERT INTO TEST."websites" VALUES(1, 'Google', 'https://www.google.cm/', 1, 'USA');
1 row affected (0.212 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."websites" VALUES(2, '淘寶', 'https://www.taobao.com/', 4689, 'CN');
1 row affected (0.036 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."websites" VALUES(3, '豆瓣', 'https://www.douban.com/', 325, 'CN');
1 row affected (0.02 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."websites" VALUES(4, '微博', 'http://weibo.com/', 20, 'CN');
1 row affected (0.039 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."websites" VALUES(5, 'Facebook', 'https://www.facebook.com/', 3, 'USA');
1 row affected (0.027 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."websites" VALUES(7, 'stackoverflow', 'http://stackoverflow.com/', 0, 'IND');
1 row affected (0.016 seconds)

--  2.2 插入 access_log 表測試數據
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(1, 1, 45, '2016-05-10');
1 row affected (0.049 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(2, 3, 100, '2016-05-13');
1 row affected (0.064 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(3, 1, 230, '2016-05-14');
1 row affected (0.054 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(4, 2, 10, '2016-05-14');
1 row affected (0.017 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(5, 5, 205, '2016-05-14');
1 row affected (0.021 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(6, 4, 13, '2016-05-15');
1 row affected (0.018 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(7, 3, 220, '2016-05-15');
1 row affected (0.038 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(8, 5, 545, '2016-05-16');
1 row affected (0.03 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(9, 3, 201, '2016-05-17');
1 row affected (0.019 seconds)
0: jdbc:phoenix:> UPSERT INTO TEST."access_log" VALUES(10, 6, 419, '2018-11-21');
1 row affected (0.02 seconds)

-- 3 查看錶中的數據
--  3.1 查看 websites 表數據
0: jdbc:phoenix:> SELECT * FROM TEST."websites";
+-----+----------------+----------------------------+--------+----------+
| id  |      name      |            url             | alexa  | country  |
+-----+----------------+----------------------------+--------+----------+
| 1   | Google         | https://www.google.cm/     | 1      | USA      |
| 2   | 淘寶             | https://www.taobao.com/    | 4689   | CN       |
| 3   | 豆瓣             | https://www.douban.com/    | 325    | CN       |
| 4   | 微博             | http://weibo.com/          | 20     | CN       |
| 5   | Facebook       | https://www.facebook.com/  | 3      | USA      |
| 7   | stackoverflow  | http://stackoverflow.com/  | 0      | IND      |
+-----+----------------+----------------------------+--------+----------+
6 rows selected (0.139 seconds)


--  3.2 查看 access_log 表數據
0: jdbc:phoenix:> SELECT * FROM TEST."access_log";
+------+----------+--------+--------------------------+
| aid  | site_id  | count  |       access_date        |
+------+----------+--------+--------------------------+
| 1    | 1        | 45     | 2016-05-10 00:00:00.000  |
| 2    | 3        | 100    | 2016-05-13 00:00:00.000  |
| 3    | 1        | 230    | 2016-05-14 00:00:00.000  |
| 4    | 2        | 10     | 2016-05-14 00:00:00.000  |
| 5    | 5        | 205    | 2016-05-14 00:00:00.000  |
| 6    | 4        | 13     | 2016-05-15 00:00:00.000  |
| 7    | 3        | 220    | 2016-05-15 00:00:00.000  |
| 8    | 5        | 545    | 2016-05-16 00:00:00.000  |
| 9    | 3        | 201    | 2016-05-17 00:00:00.000  |
| 10   | 6        | 419    | 2018-11-21 00:00:00.000  |
+------+----------+--------+--------------------------+
10 rows selected (0.123 seconds)


-- 4 INNER JOIN
--  可以看到 inner join 返回的是滿足條件的A表和B表都都存在的數據
0: jdbc:phoenix:> SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > INNER JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id"
. . . . . . . . > ORDER BY B."count" DESC;
+-----------+----------+--------------------------+
|  A.name   | B.count  |      B.access_date       |
+-----------+----------+--------------------------+
| Facebook  | 545      | 2016-05-16 00:00:00.000  |
| Google    | 230      | 2016-05-14 00:00:00.000  |
| 豆瓣        | 220      | 2016-05-15 00:00:00.000  |
| Facebook  | 205      | 2016-05-14 00:00:00.000  |
| 豆瓣        | 201      | 2016-05-17 00:00:00.000  |
| 豆瓣        | 100      | 2016-05-13 00:00:00.000  |
| Google    | 45       | 2016-05-10 00:00:00.000  |
| 微博        | 13       | 2016-05-15 00:00:00.000  |
| 淘寶        | 10       | 2016-05-14 00:00:00.000  |
+-----------+----------+--------------------------+
9 rows selected (0.276 seconds)


-- 5 LEFT JOIN
--  可以看到 A.name=stackoverflow 在A表存在,但是B表不存在,依然返回作爲結果。
--     而 B.count=419 的數據A表沒有匹配到,因此就沒有返回。 總之以左表A爲準
--  注意:這裏和MySQL不一樣的地方是,null值排在最前面(無論是排序是 ASC 還是 DESC)
0: jdbc:phoenix:> SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > LEFT JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id"
. . . . . . . . > ORDER BY B."count" DESC;
+----------------+----------+--------------------------+
|     A.name     | B.count  |      B.access_date       |
+----------------+----------+--------------------------+
| stackoverflow  | null     |                          |
| Facebook       | 545      | 2016-05-16 00:00:00.000  |
| Google         | 230      | 2016-05-14 00:00:00.000  |
| 豆瓣             | 220      | 2016-05-15 00:00:00.000  |
| Facebook       | 205      | 2016-05-14 00:00:00.000  |
| 豆瓣             | 201      | 2016-05-17 00:00:00.000  |
| 豆瓣             | 100      | 2016-05-13 00:00:00.000  |
| Google         | 45       | 2016-05-10 00:00:00.000  |
| 微博             | 13       | 2016-05-15 00:00:00.000  |
| 淘寶             | 10       | 2016-05-14 00:00:00.000  |
+----------------+----------+--------------------------+
10 rows selected (0.169 seconds)

-- 6 RIGHT JOIN 
--  可以看到  B.count=419 在B表存在,但是A表不存在,依然返回作爲結果。
--     而  A.name=stackoverflow 的數據B表沒有匹配到,因此就沒有返回。 總之以右表B爲準
0: jdbc:phoenix:> SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > RIGHT JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id"
. . . . . . . . > ORDER BY B."count" DESC;
+-----------+----------+--------------------------+
|  A.name   | B.count  |      B.access_date       |
+-----------+----------+--------------------------+
| Facebook  | 545      | 2016-05-16 00:00:00.000  |
|           | 419      | 2018-11-21 00:00:00.000  |
| Google    | 230      | 2016-05-14 00:00:00.000  |
| 豆瓣        | 220      | 2016-05-15 00:00:00.000  |
| Facebook  | 205      | 2016-05-14 00:00:00.000  |
| 豆瓣        | 201      | 2016-05-17 00:00:00.000  |
| 豆瓣        | 100      | 2016-05-13 00:00:00.000  |
| Google    | 45       | 2016-05-10 00:00:00.000  |
| 微博        | 13       | 2016-05-15 00:00:00.000  |
| 淘寶        | 10       | 2016-05-14 00:00:00.000  |
+-----------+----------+--------------------------+
10 rows selected (0.205 seconds)


-- 7 UNION ALL。Phoenix不支持 FULL OUTER JOIN ,但可以通過 UNION ALL 實現
--  FULL OUTER JOIN 等價於 (LEFT OUTER JOIN) UNION ALL (RIGHT OUTER JOIN )
--  可以看到返回左表和右表都有的所有數據.
--  注意:目前還不支持 UNION ALL 的左右 SELECT 語句中有 ORDER BY ,否則SQL解析時會報如下錯誤
--        ERROR 602 (42P00): Syntax error. Missing "EOF" at line 5, column 1.
--       如果要實現排序,可以用子查詢或者視圖來實現
0: jdbc:phoenix:> SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > LEFT JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id"
. . . . . . . . > UNION ALL
. . . . . . . . > SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > RIGHT JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id";
+----------------+--------+--------------------------+
|      NAME      | COUNT  |       ACCESS_DATE        |
+----------------+--------+--------------------------+
| Google         | 45     | 2016-05-10 00:00:00.000  |
| Google         | 230    | 2016-05-14 00:00:00.000  |
| 淘寶             | 10     | 2016-05-14 00:00:00.000  |
| 豆瓣             | 100    | 2016-05-13 00:00:00.000  |
| 豆瓣             | 220    | 2016-05-15 00:00:00.000  |
| 豆瓣             | 201    | 2016-05-17 00:00:00.000  |
| 微博             | 13     | 2016-05-15 00:00:00.000  |
| Facebook       | 205    | 2016-05-14 00:00:00.000  |
| Facebook       | 545    | 2016-05-16 00:00:00.000  |
| stackoverflow  | null   |                          |
| Google         | 45     | 2016-05-10 00:00:00.000  |
| 豆瓣             | 100    | 2016-05-13 00:00:00.000  |
| Google         | 230    | 2016-05-14 00:00:00.000  |
| 淘寶             | 10     | 2016-05-14 00:00:00.000  |
| Facebook       | 205    | 2016-05-14 00:00:00.000  |
| 微博             | 13     | 2016-05-15 00:00:00.000  |
| 豆瓣             | 220    | 2016-05-15 00:00:00.000  |
| Facebook       | 545    | 2016-05-16 00:00:00.000  |
| 豆瓣             | 201    | 2016-05-17 00:00:00.000  |
|                | 419    | 2018-11-21 00:00:00.000  |
+----------------+--------+--------------------------+
20 rows selected (0.258 seconds)

-- 7.1 子查詢方式實現 UNION ALL 排序
0: jdbc:phoenix:> SELECT * FROM (
. . . . . . . . > SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > LEFT JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id"
. . . . . . . . > UNION ALL
. . . . . . . . > SELECT A."name",B."count",B."access_date"
. . . . . . . . > FROM TEST."websites" AS A
. . . . . . . . > RIGHT JOIN TEST."access_log" AS B
. . . . . . . . > ON A."id"=B."site_id"
. . . . . . . . > ) ORDER BY COUNT DESC;
+----------------+--------+--------------------------+
|      NAME      | COUNT  |       ACCESS_DATE        |
+----------------+--------+--------------------------+
| stackoverflow  | null   |                          |
| Facebook       | 545    | 2016-05-16 00:00:00.000  |
| Facebook       | 545    | 2016-05-16 00:00:00.000  |
|                | 419    | 2018-11-21 00:00:00.000  |
| Google         | 230    | 2016-05-14 00:00:00.000  |
| Google         | 230    | 2016-05-14 00:00:00.000  |
| 豆瓣             | 220    | 2016-05-15 00:00:00.000  |
| 豆瓣             | 220    | 2016-05-15 00:00:00.000  |
| Facebook       | 205    | 2016-05-14 00:00:00.000  |
| Facebook       | 205    | 2016-05-14 00:00:00.000  |
| 豆瓣             | 201    | 2016-05-17 00:00:00.000  |
| 豆瓣             | 201    | 2016-05-17 00:00:00.000  |
| 豆瓣             | 100    | 2016-05-13 00:00:00.000  |
| 豆瓣             | 100    | 2016-05-13 00:00:00.000  |
| Google         | 45     | 2016-05-10 00:00:00.000  |
| Google         | 45     | 2016-05-10 00:00:00.000  |
| 微博             | 13     | 2016-05-15 00:00:00.000  |
| 微博             | 13     | 2016-05-15 00:00:00.000  |
| 淘寶             | 10     | 2016-05-14 00:00:00.000  |
| 淘寶             | 10     | 2016-05-14 00:00:00.000  |
+----------------+--------+--------------------------+
20 rows selected (0.291 seconds)

-- 7.2 視圖方式實現 UNION ALL 排序
--  如果刪除視圖,語法格式爲:DROP VIEW IF EXISTS my_schema.my_view
--  注意1:目前視圖中還不能包含 AS 關鍵字
--  注意2:目前子句中不能選擇字段,只能用*號,否則包如下錯誤:
--    ERROR 604 (42P00): Syntax error. Mismatched input. Expecting "ASTERISK", got "TEST" at line 2, column 8.
--  Debug:目前版本存在問題。當前視圖支持的語法比較有限,SELECT中不能有複雜的語法,否則解析時會無法判斷結束標記。可以反饋社區等後期修復
-- CREATE VIEW IF EXISTS TEST."websites_union_access_log" AS
-- SELECT * FROM TEST."websites" LEFT JOIN TEST."access_log"
-- ON TEST."websites"."id"=TEST."access_log"."site_id"
-- UNION ALL
-- SELECT * FROM TEST."websites" 
-- RIGHT JOIN TEST."access_log"
-- ON TEST."websites"."id"=TEST."access_log"."site_id";

-- SELECT AB."name",AB."count",AB."access_date" FROM TEST."websites_union_access_log" 
-- AS AB ORDER BY AB."count" DESC;

2.10 JDBC

使用JDBC方式連接Phoenix,對數據進行處理

2.10.1 新建一個Maven工程

在IDEA中新建一個Maven項目

2.10.2 pom.xml

<dependencies>
    <!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix-core -->
    <dependency>
        <groupId>org.apache.phoenix</groupId>
        <artifactId>phoenix-core</artifactId>
        <version>5.0.0-HBase-2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

2.10.3 JDBC Client代碼

PhoenixJdbcClient


3 工具

以下兩款常用的工具都支持Win和Mac OS

3.1 DBeaver

在創建Phoenix連接,編輯驅動設那裏點擊 添加文件(F) ,選中前面我們編譯出來的phoenix-5.0.0-HBase-2.0-client.jar包即可。
DBeaver

3.2 SQuirrel SQL

3.2.1 下載

進入這個頁面下載 http://squirrel-sql.sourceforge.net/,這裏可以下載壓縮包版的 Plain zips the latest release for Windows/Linux/MacOS X/others。有三個版本,選在一個版本下載即可,例如這裏下載squirrelsql-3.9.1-optional.zip

3.2.2 解壓和配置

解壓到安裝目錄,然後將phoenix-5.0.0-HBase-2.0-client.jarphoenix-core-5.0.0-HBase-2.0.jar下載或者軟連接到解壓的包中的lib目錄中。

Su-yuexi:squirrelsql-3.9.1-optional yoreyuan$ cd lib
Su-yuexi:lib yoreyuan$ ln -s ~/.dbeaver-drivers/phoenix-5.0.0-HBase-2.0-client.jar phoenix-5.0.0-HBase-2.0-client.jar
Su-yuexi:lib yoreyuan$ ln -s ~/soft/maven/repository/org/apache/phoenix/phoenix-core/5.0.0-HBase-2.0/phoenix-core-5.0.0-HBase-2.0.jar phoenix-core-5.0.0-HBase-2.0.jar
Su-yuexi:lib yoreyuan$ cd ../
Su-yuexi:squirrelsql-3.9.1-optional yoreyuan$ chmod +x squirrel-sql-mac.sh

squirrelsql root

3.2.3 啓動

執行啓動腳本,此時會彈出SQuirrel SQL Client HelpSQuirrel SQL Client窗口。如果安裝或其它操作也可以查看幫助文檔。

./squirrel-sql-mac.sh

3.2.4 配置 Phoenix 驅動

  • 添加Driver。點擊Driver
  • Driver Name: 填寫一個名字
  • Example URL: jdbc:phoenix:cdh2,cdh3:2181
  • Java Class Path選在我們前面添加的lib/phoenix-core-5.0.0-HBase-2.0.jar
  • 點擊List Drivers,等一會會自動在Class Name:補上org.apache.phoenix.jdbc.PhoenixDriver
  • OK
  • 配置成功後會在左側的Drivers區域添加上去我們剛配置的Phoenix連接。

3.2.5 連接Phoenix

  • 點擊Aliases中的
  • Name: 連接的別名
  • Driver: 選擇上一步配置好的驅動。URL會自動填入。
  • Test。User Name 和 Password 可以不用填寫。
  • OK

SQuirrel SQL Client - Aliases

3.2.6 查詢

執行SQL查詢數據,如上圖右,這裏需要注意的如果我們建表時沒有指定Schema,則創建的表都會在一個空的Schema下(DBeaver工具目前的版本無法顯示空Schema下的表,但是可以正產查詢),點擊點擊SQL,就可以編寫SQL,進行數據的查詢等操作,例如查詢表空schema的表數據:SELECT * FROM WEB_stat;,如果有schema在表前面加上用英文點號分割,例如查詢test下的person表:SELECT * FROM test.person;
在這裏插入圖片描述



4 資料

這裏推薦一份 雲棲社區的一份資料,可以參考

Phoenix資料


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