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.0包apache-phoenix-5.0.0-HBase-2.0-bin.tar.gz
;第二種是通過編譯源碼的方式來安裝。這裏我們直接使用源碼編譯來進行安裝。
目錄
- 1 Installation
- 1.1 源碼編譯
- 1.2 安裝
- 1.3 Cloudera Manager 的配置
- 2 Using
- 2.1 NoClassDefFoundError解決
- 2.2 原有HBase表的映射同步
- 2.3 查看錶信息和插入數據
- 2.4 數據類型
- 2.5 修改表信息
- 2.6 刪除庫
- 2.7 執行SQL腳本
- 2.8 DDL語法
- 2.9 DML和DQL語法
- 2.9.1 Join
- 2.10 JDBC
- 2.10.1 新建一個Maven工程
- 2.10.2 pom.xml
- 2.10.3 JDBC Client代碼
- 3 工具
- 3.1 DBeaver
- 3.2 SQuirrel SQL
- 4 資料
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>
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 數據類型
字段類型 | 映射的類 | 值的範圍 | 佔用字節 |
---|---|---|---|
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對應的操作就是UPSERT
和DELETE
。數據查詢語言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語句的行數據。
關於這幾種連接文氏圖(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 ,外連接查詢能返回左右表裏的所有記錄,其中左右表裏能關聯起來的記錄被連接後返回。
現在有兩張表,一個是網站數據表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代碼
3 工具
以下兩款常用的工具都支持Win和Mac OS
3.1 DBeaver
在創建Phoenix連接,編輯驅動設那裏點擊 添加文件(F) ,選中前面我們編譯出來的phoenix-5.0.0-HBase-2.0-client.jar
包即可。
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.jar
和phoenix-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
3.2.3 啓動
執行啓動腳本,此時會彈出SQuirrel SQL Client Help
和SQuirrel 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
3.2.6 查詢
執行SQL查詢數據,如上圖右,這裏需要注意的如果我們建表時沒有指定Schema,則創建的表都會在一個空的Schema下(DBeaver工具目前的版本無法顯示空Schema下的表,但是可以正產查詢),點擊點擊SQL,就可以編寫SQL,進行數據的查詢等操作,例如查詢表空schema的表數據:SELECT * FROM WEB_stat;
,如果有schema在表前面加上用英文點號分割,例如查詢test下的person表:SELECT * FROM test.person;
。
4 資料
這裏推薦一份 雲棲社區的一份資料,可以參考