详细语法参见官网语法这里只给出常用的一些语法
!table --查看表信息 !describe tablename --可以查看表字段信息 !history --可以查看执行的历史SQL !dbinfo !index tb; --查看tb的索引 !quit; --退出phoenix shell help --查看其他操作
hadoop jar /home/phoenix-4.12/phoenix-4.6.0-HBase-1.0-client.jar org.apache.phoenix.mapreduce.CsvBulkLoadTool -t POPULATION -i /datas/us_population.csv -t :tableName -i: input file 文件必须在hdfs文件上。
在
Phoenix
中是没有Database
的概念的,所有的表都在同一个命名空间。但支持多个命名空间,在hbase-site.xml
中进行下面参数设置为true
,创建的带有schema
的表将映射到一个namespace
。
<property> <name>phoenix.schema.isNamespaceMappingEnabled</name> <value>true</value> </property>
在
HBase
中创建Schema
和相应的名称空间。执行此命令的用户应具有管理员权限才能在中创建HBase名称空间。
--如果存在就不创建 CREATE SCHEMA IF NOT EXISTS my_schema; --创建SCHEMA CREATE SCHEMA my_schema;
此操作仅在
shell
中支持在可视化工具客户端中不支持。
use default; use schema_name;
从
HBase
删除模式和相应的名称空间。要启用名称空间映射,仅当架构不包含任何表时,此语句才会成功。
--存在删除SCHEMA DROP SCHEMA IF EXISTS my_schema --删除SCHEMA DROP SCHEMA my_schema
权限级别:
R
-读取,W
-写入,X
-执行,C
-创建,A
-管理员,要启用/禁用访问控制,请参阅hbase配置。
应在基表上授予权限。它将传播到其所有索引和视图。组权限适用于组中的所有用户,架构权限适用于具有该架构的所有表。未指定表/架构的授予语句在GLOBAL
级别上分配。
Phoenix
不会向最终用户公开Execute('X')
功能。但是,具有辅助索引的可变表是必需的。
GRANT 'RXC' TO 'User1'--为User1添加读、执行、创建权限 GRANT 'RWXC' TO GROUP 'Group1'--为Group1添加读、写、执行、创建权限 GRANT 'A' ON Table1 TO 'User2' --给用户User2添加Table1管理权限 GRANT 'RWX' ON my_schema.my_table TO 'User2'--为User2添加my_schema.my_table的读、写、执行权限 GRANT 'A' ON SCHEMA my_schema TO 'User3'--为User3添加my_schema添加管理权限
- 撤消表、
schema
或用户级别的权限。权限由HBase hbase:acl
表中的管理,因此需要启用访问控制。Phoenix 4.14
版及更高版本将提供此功能。要启用/禁用访问控制,请参阅hbase配置。- 组权限适用于组中的所有用户,
schema
权限适用于具有该schema
的所有表。应该撤消对基表的许可。它将传播到其所有索引和视图。未指定表/schema
的吊销语句在GLOBAL
级别分配。- 撤消将删除该级别的所有权限。
- 撤消权限必须与通过“授予权限”语句分配的权限完全相同。级别是指表,
schema
或用户。撤销任何RXPhoenix SYSTEM
表上的任何' '
权限都将导致异常。撤消任何' RWX'
权限,SYSTEM.SEQUENCE
将导致在访问序列时发生异常。
以下示例用于撤消使用上述GRANT
语句中的示例授予的权限。
REVOKE FROM 'User1'--撤销User1读、执行、创建权限 REVOKE FROM GROUP 'Group1'--撤销Group1权限 REVOKE ON Table1 FROM 'User2'--撤销User2的Table1权限 REVOKE ON my_schema.my_table FROM 'User2'--撤销User2对my_schema.my_table的权限 REVOKE ON SCHEMA my_schema FROM 'User3'--撤销User3对my_schema的权限
!table或者!tables
Hbase
是区分大小写的,Phoenix
默认会把sql
语句中的小写转换成大写,再建表,如果不希望转换,需要将表名,字段名等使用引号。
Hbase
默认phoenix
表的主键对应到ROW,column family
名为0
,也可以在建表的时候指定column family
。
--表名,列族名默认大写在,指定列族主键 CREATE TABLE IF NOT EXISTS my_schema.population ( State CHAR(2) NOT NULL, City VARCHAR NOT NULL, Population BIGINT CONSTRAINT my_pk PRIMARY KEY (state, city));
在
phoenix
中,默认情况下,表名等会自动转换为大写,若要小写,使用双引号,如"population"
。
加盐
Salting
能够通过预分区(pre-splitting
)数据到多个region
中来显著提升读写性能。本质是在hbase
中,rowkey
的byte
数组的第一个字节位置设定一个系统生成的byte
值,这个byte
值是由主键生成rowkey
的byte
数组做一个哈希算法,计算得来的。Salting
之后可以把数据分布到不同的region
上,这样有利于phoenix
并发的读写操作。SALT_BUCKETS
的值范围在(1 ~ 256
)。
--创建加盐表 create table test ( host varchar not null primary key, description varchar ) salt_buckets=16; --更新加盐表 upsert into test (host,description) values ('192.168.0.1','s1'); upsert into test (host,description) values ('192.168.0.2','s2'); upsert into test (host,description) values ('192.168.0.3','s3');
salted table
可以自动在每一个rowkey
前面加上一个字节,这样对于一段连续的rowkeys
,它们在表中实际存储时,就被自动地分布到不同的region
中去了。当指定要读写该段区间内的数据时,也就避免了读写操作都集中在同一个region
上。简而言之,如果我们用Phoenix
创建了一个saltedtable
,那么向该表中写入数据时,原始的rowkey
的前面会被自动地加上一个byte
(不同的rowkey
会被分配不同的byte
),使得连续的rowkeys
也能被均匀地分布到多个regions
。
Salting
能够自动的设置表预分区,但是你得去控制表是如何分区的,所以在建phoenix
表时,可以精确的指定要根据什么值来做预分区,比如:
create table test ( host varchar not null primary key, description varchar ) split on ('cs','eu','na');
列族包含相关的数据都在独立的文件中,在
Phoenix
设置多个列族可以提高查询性能。创建两个列族:
--建立多列族表 create table test_colunms ( mykey varchar not null primary key, a.col1 varchar, a.col2 varchar, b.col3 varchar ); --更新记录 upsert into test_colunms values ('key1','a1','b1','c1'); upsert into test_colunms values ('key2','a2','b2','c2');
create table test ( host varchar not null primary key, description varchar ) compression='snappy';
建表语句中,还可以附加一些
HBase
表、列族配置选项,如DATA_BLOCK_ENCODING、VERSIONS、MAX_FILESIZE 、TTLetc
。具体的设置值还需要大家去进一步了解。
--DATA_BLOCK_ENCODING、VERSIONS、MAX_FILESIZE的使用 CREATE TABLE IF NOT EXISTS "my_case_sensitive_table"( "id" char(10) not null primary key, "value" integer) DATA_BLOCK_ENCODING='NONE', VERSIONS=5, MAX_FILESIZE=2000000 split on (?, ?, ?) --TTL的使用 CREATE TABLE IF NOT EXISTS my_schema.my_table ( org_id CHAR(15), entity_id CHAR(15), payload binary(1000), CONSTRAINT pk PRIMARY KEY (org_id, entity_id) ) TTL=86400
删除表,可选使用
CASCADE
关键字,他会导致删除表上建立的所有视图。删除表时,默认情况下HBase
会删除基础数据表和索引表。配置phoenix.schema.dropMetaData
可以用于改变默认配置在删除时不会删除数据并保留HBase
表以进行时间点查询。
--直接删除 drop table my_schema.population; --如果表存在就删除 drop table if exists my_schema.population; --删除表的同时删除表上建立的所有视图 drop table my_schema.population cascade;
Phoenix
的SELECT
语法union all
,group by
,order by
,limit (offset first与limit相同)
,offset
都支持。
--查询结果保留1000条 select * from test limit 1000; --返回结果100-1000,Offset跳过返回结果之前的前n行 select * from test limit 3 offset 2; select * from test limit 3 offset 1; --union all select full_name from sales_person where ranking >= 5.0 union all select reviewer_name from customer_review where score >= 8.0
在
Phoenix
中是没有Insert
语句的,取而代之的是Upsert
语句。Upsert
有两种用法,分别是:upsert into
和upsert select
。
类似于
insert into
的语句,旨在单条插入外部数据
--不加字段信息 upsert into my_schema.population values('BJ','BeiJing',8143197); --加字段信息 upsert into my_schema.population(State,City,population) values('SZ','ShenZhen',6732422);
类似于
Hive中的insert select
语句,旨在批量插入其他表的数据。
--带字段插入 upsert into population (state,city,population) select state,city,population from tb2 where population < 7000000; --不带字段插入 upsert into population select state,city,population from tb2 where population > 7000000; --支持select * upsert into population select * from tb2 where population > 7000000;
在
phoenix
中插入语句并不会像传统数据库一样存在重复数据。因为Phoenix
是构建在HBase
之上的,也就是必须存在一个主键。后面插入的会覆盖前面的,但是时间戳不一样。
由于
HBase
的主键设计,相同rowkey
的内容可以直接覆盖,这就变相的更新了数据。所以Phoenix
的更新操作仍旧是upsert into
和upsert select
。实例同上插入记录。
delete from population; #清空表中所有记录,Phoenix中不能使用truncate table tb; delete from my_schema.population where city = 'LinYin';#删除表中城市为kenai的记录 delete from system.catalog where table_name = 'int_s6a';#删除system.catalog中table_name为int_s6a的记录