phoenix可以用sql语句的形式来操作hbase数据库中的数据,并且phoenix可以支持大部分的mysql里面的sql语法与格式。因此具体的操作,比如增删改查本篇博客不记录了,与mysql里面的sql语句差不多。 但是需要注意以下,phoenix的插入语句不是insert,而是upsert upsert into “表名” values()
这里记录一下phoenix与hbase的表的映射 一般情况下,phoenix是查看不到在hbase中创建的表。因此如果想要在phoenix中操作hbase中的表,就需要通过表映射的操作。
映射方式有两种:视图映射与表映射
视图映射
在phoenix中创建hbase的表的视图,视图只能用来查询,不能通过视图对源数据(hbase的表中存储的数据)进行增删改等操作
先在hbase里面创建一张表
hbase(main):007:0> create 'student','name','age'
往表中插入一条数据
put 'student','1001','name:firstname','zhang1'
put 'student','1001','name:lastname','zhang2'
put 'student','1001','age:big','18'
put 'student','1001','age:small','17'
插入数据完成后,在phoenix中创建这张表的视图
create view "student"(
studentid varchar primary key,
"name"."firstname" varchar,
"name"."lastname" varchar,
"age"."big" varchar,
"age"."small" varchar
)column_encoded_bytes=0;
查询一下视图里面的数据 在phoenix查询数据时,要将给表名加上双引号 测试一下能否在视图中修改数据 发现会报错,提示视图是 read only,只读不能修改
那么接下来再测试一下,如果将hbase中的表删除(即删除源数据)
hbase(main):013:0> disable 'student';
hbase(main):014:0* drop 'student';
再到phoenix里面查询视图student里面的数据,就会报错
但是用 !table 查询全部的表时,会发现依旧还有 student视图的记录,此时还需要删除一下这个视图
表映射
在phoenix中使用建表语句,create table 表名分为两种情况,(假设这里要在phoenix中创建student表)
- HBase中存在student表,则phoenix的建表语句本质上不是创建一张新表,而是类似于创建Hbase表的视图的方式,创建一张关联表。
- HBase中不存在student表,则phoenix的建表语句是在创建一张新的表
这里再到hbase中将上面删去的student表重新创建回来并且加载数据 然后到phoenix中输入以下的建表语句
create table "student" (
empid varchar primary key,
"name"."firstname" varchar,
"name"."lastname"varchar,
"age"."big" varchar,
"age"."small" varchar
)column_encoded_bytes=0;
注意这里的Table_type,表的类型是table,而不是视图 现在查询一下表里面的数据 这里就会发现phoenix这里创建的是关联表,关联的是hbase中的同名表的数据
修改一下源数据的数据
hbase(main):021:0> put 'student','1001','name:firstname','chen1'
再来查看一下phoenix表中的数据 发现这里的数据也发生了改变
那么现在修改phoenix里面的数据,来看看hbase里面的源数据会不会发生变动
upsert into "student" values('1002','wang1','wang2','12','11');
这里就需要强调一下视图与关联表的区别了
- 关联表的数据可以改变,并且会影响hbase里面的数据
- 视图里面的数据不能改变
- 删除关联表,会导致源表也被删除
- 删除视图,不会影响到hbase中的源表
前面尝试了在phoenix中创建关联表,现在创建一张hbase中没有的表试试看
create table "teacher" (
empid varchar primary key,
"name"."firstname" varchar,
"name"."lastname"varchar,
"age"."big" varchar,
"age"."small" varchar
)column_encoded_bytes=0;
在phoenix里面创建了一张新表,那么hbase中也会出现一张一样的表 因此在phoenix里面创建表的时候可以根据需要对Hbase表结构进行一些设置
|