Phoenix 基本使用

进入Phoenix

phoenix-sqlline.py 10.248.161.18:2181:/hbase

 或者进入目录下执行

cd /opt/cloudera/parcels/APACHE_PHOENIX/bin

关联Hbase原有表

  • 创建Hbase表,列簇为 cf1 , cf2
create 'phoenix_hbase_test','cf1','cf2'
  • 插入测试数据
put 'phoenix_hbase_test', 'key1','cf1:name','zhangsan'
put 'phoenix_hbase_test', 'key1','cf2:age','18'
put 'phoenix_hbase_test', 'key2','cf1:name','lisi'
put 'phoenix_hbase_test', 'key2','cf2:age','26'
put 'phoenix_hbase_test', 'key3','cf1:name','chenwu'
put 'phoenix_hbase_test', 'key4','cf2:age','10'
  • 查看

Phoenix 关联hbase表历史数据_java

  •  创建Phoenix表关联

在Phoenix执行

create table "phoenix_hbase_test"("rowkey" varchar primary key, "cf1"."name" varchar , "cf2"."age" varchar)  column_encoded_bytes=0;

或者创建视图(可以理解为视图是hive的外部表,table是内部表,删除内部表hbase表也会删除,删除视图hbase表还存在)

create view "phoenix_hbase_test"("rowkey" varchar primary key, "cf1"."name" varchar , "cf2"."age" varchar) ;

 

注意:

        这里这里在Phoenix后面有column_encoded_bytes=0;  意思是禁用对字段值进行压缩编码(4.10)后的新特性,如果不加会查询会无数据,具体可参考:

Phoenix 关联hbase表历史数据_bc_02

  • 查询数据 
0: jdbc:phoenix:xxxx:2181:/hbase> select * from "phoenix_hbase_test";
+---------+-----------+------+
| rowkey  |   name    | age  |
+---------+-----------+------+
| key1    | zhangsan  | 18   |
| key2    | lisi      | 26   |
| key3    | chenwu    |      |
| key4    |           | 10   |
+---------+-----------+------+
4 rows selected (0.025 seconds)
  • Phoenix插入数据 并查看内容
0: jdbc:phoenix:xxx:2181:/hbase> upsert into "phoenix_hbase_test"("rowkey","cf1"."name","cf2"."age") values('key5','shazi','66');
1 row affected (0.007 seconds)
0: jdbc:phoenix:xxx:2181:/hbase> select * from "phoenix_hbase_test";
+---------+-----------+------+
| rowkey  |   name    | age  |
+---------+-----------+------+
| key1    | zhangsan  | 18   |
| key2    | lisi      | 26   |
| key3    | chenwu    |      |
| key4    |           | 10   |
| key5    | shazi     | 66   |
+---------+-----------+------+
5 rows selected (0.021 seconds)

如果是视图的场景下,是无法upsert into ,只能通过hbase put添加数据 

0: jdbc:phoenix:xxx:2181:/hbase> upsert into "phoenix_hbase_test"("rowkey","cf1"."name","cf2"."age") values('key5','shazi','66');
Error: ERROR 505 (42000): Table is read only. (state=42000,code=505)
org.apache.phoenix.schema.ReadOnlyTableException: ERROR 505 (42000): Table is read only.
	at org.apache.phoenix.compile.UpsertCompiler.compile(UpsertCompiler.java:359)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:784)
	at org.apache.phoenix.jdbc.PhoenixStatement$ExecutableUpsertStatement.compilePlan(PhoenixStatement.java:770)
	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:401)
	at org.apache.phoenix.jdbc.PhoenixStatement$2.call(PhoenixStatement.java:391)
	at org.apache.phoenix.call.CallRunner.run(CallRunner.java:53)
	at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:389)
	at org.apache.phoenix.jdbc.PhoenixStatement.executeMutation(PhoenixStatement.java:378)
	at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1825)
	at sqlline.Commands.execute(Commands.java:822)
	at sqlline.Commands.sql(Commands.java:732)
	at sqlline.SqlLine.dispatch(SqlLine.java:813)
	at sqlline.SqlLine.begin(SqlLine.java:686)
	at sqlline.SqlLine.start(SqlLine.java:398)
	at sqlline.SqlLine.main(SqlLine.java:291)

视图有以下几点限制

1.只有通过VIEW进行更新时,才能维护VIEW上的INDEX。通过底层TABLE或父VIEW进行的更新不会反映在索引(PHOENIX-1499)中。
2.如果主键列的主键约束以可变长度列(PHOENIX-2157)结尾,则主键列不能添加到VIEW中。
3.VIEW可以通过简单的SELECT *查询仅在单个表上定义。您不能在多个连接的表格或聚合(PHOENIX-1505,PHOENIX-1506)上创建VIEW 。
4.当一个列添加到VIEW时,新列不会自动添加到任何子视图(PHOENIX-2054)。解决方法是手动将该列添加到子视图。
5.所有列在创建时都必须投影到VIEW中(即仅支持CREATE VIEW ... AS SELECT *)。但是,请注意,在通过ALTER VIEW命令创建后,您可以在VIEW中删除从基表继承的非主键列。在未来的版本(PHOENIX-1507)中支持在SELECT子句中提供列和或表达式的子集。