Phoenix可以有4种方式调用
- 批处理方式
- 命令行方式
- GUI方式
- JDBC调用方式
(1)批处理方式
A: 创建user_phoenix.sql文件
内容如下
CREATE TABLE IF NOT EXISTS user_phoenix (
state CHAR(2) NOT NULL,
city VARCHAR NOT NULL,
population BIGINT
CONSTRAINT my_pk PRIMARY KEY (state, city)
);
B: 创建user_phoenix.csv数据文件
NY,New York,8143197
CA,Los Angeles,3844829
IL,Chicago,2842518
TX,Houston,2016582
PA,Philadelphia,1463281
AZ,Phoenix,1461575
TX,San Antonio,1256509
CA,San Diego,1255540
TX,Dallas,1213825
CA,San Jose,912332
C: 创建user_phoenix_query.sql文件 内容为:
SELECT state as "State",count(city) as "City Count",sum(population) as "Population Sum" FROM user_phoenix GROUP BY state ORDER BY sum(population) DESC;
D: 执行
python /export/servers/phoenix-4.14.0-cdh5.14.2/bin/psql.py node01:2181 user_phoenix.sql user_phoenix.csv user_phoenix_query.sql
这条命令同时做了三件事:创建表、插入数据、查询结果
用Hbase shell 看下会发现多出来一个 USER_PHOENIX 表,用scan 命令查看一下这个表的数据
hbase(main):002:0> scan 'USER_PHOENIX'
结论:
之前定义的Primary key 为state,city, 于是Phoenix就把输入的state,city的值拼起来成为rowkey
其他的字段还是按照列名去保存,默认的列族为0
还有一个0:_0这个列是没有值的,这个是Phoenix处于性能方面考虑增加的一个列,不用管这个列
(2) 命令行方式
A: 执行命令
./sqlline.py node01:2181 可以进入命令行模式
B: 相关命令
开头需要一个感叹号
使用help可以打印出所有命令
!all |
对所有当前连接执行指定的SQL |
!autocommit |
打开或关闭自动提交模式 |
!batch |
启动或执行一批语句 |
!brief |
关闭详细模式 |
!call |
执行可调用语句 |
!close |
关闭与数据库的当前连接 |
!closeall |
关闭所有当前打开的连接 |
!columns |
列出指定表的所有列 |
!commit |
提交当前事务(如果自动提交已关闭) |
!connect |
打开与数据库的新连接。 |
!dbinfo |
提供有关数据库的元数据信息 |
!describe |
描述一个表 |
!dropall |
删除当前数据库中的所有表 |
!exportedkeys |
列出指定表的所有导出键 |
!go |
选择当前连接 |
!help |
打印命令使用情况摘要 |
!history |
显示命令历史记录 |
!importedkeys |
列出指定表的所有导入键 |
!indexes |
列出指定表的所有索引 |
!isolation |
为此连接设置事务隔离 |
!list |
列出当前连接 |
!manual |
显示sqlline手册 |
!metadata |
获取元数据信息 |
!nativesql |
显示指定语句的本机SQL |
!outputformat |
设置显示结果的输出格式(表格、垂直、csv、tsv、xmlattrs、xmleelements) |
!primarykeys |
列出指定表的所有主键 |
!procedures |
列出所有程序 |
!properties |
连接到属性文件中指定的数据库 |
!quit |
退出程序 |
!reconnect |
重新连接到数据库 |
!record |
将所有输出记录到指定文件 |
!rehash |
获取用于完成命令的表和列名称 |
!rollback |
回滚当前事务(如果关闭自动提交) |
!run |
从指定的文件运行脚本 |
!save |
保存当前变量和别名 |
!scan |
扫描已安装的JDBC驱动程序 |
!script |
开始将脚本保存到文件 |
!set |
设置sqlline变量 |
C: 建立employee的映射表---数据准备
数据准备然后我们来建立一个映射表,映射我之前建立过的一个hbase表 employee.有2个列族 company、family
create 'employee1','company','family'
put 'employee1','row1','company:name','ted'
put 'employee1','row1','company:position','worker'
put 'employee1','row1','family:tel','136009123xx'
put 'employee1','row2','company:name','michael'
put 'employee1','row2','company:position','manager'
put 'employee1','row2','family:tel','189422xxxx'
scan 'employee1'
在建立映射表之前要说明的是,Phoenix是大小写敏感的,并且所有命令都是大写,如果你建的表名没有用双引号括起来,那么无论你输入的是大写还是小写,建立出来的表名都是大写的,如果你需要建立出同时包含大写和小写的表名和字段名,请把表名或者字段名用双引号括起来。
你可以建立读写的表或者只读的表,他们的区别如下
读写表:如果你定义的列簇不存在,会被自动建立出来,并且赋以空值
只读表:你定义的列簇必须事先存在
D: 建立映射表
0: jdbc:phoenix:node01>
CREATE TABLE IF NOT EXISTS "employee1" (
"no" VARCHAR(10) NOT NULL PRIMARY KEY,
"company"."name" VARCHAR(30),
"company"."position" VARCHAR(20),
"family"."tel" VARCHAR(20),
"family"."age" INTEGER
);
这个语句有几个注意点
- IF NOT EXISTS可以保证如果已经有建立过这个表,配置不会被覆盖
- 作为rowkey的字段用 PRIMARY KEY标定
- 列簇用 columnFamily.columnName 来表示
- family.age 是新增的字段,之前建立测试数据的时候没有建立这个字段的原因是在hbase shell下无法直接写入数字型,使用UPSERT 命令插入数据的时候就可以看到真正的数字型在hbase 下是如何显示的
建立好后,查询一下数据
E: 查询映射表数据
0: jdbc:phoenix:node01> SELECT * FROM "employee"; +-------+----------+-----------+--------------+-------+ | no | name | position | tel | age | +-------+----------+-----------+--------------+-------+ | row1 | ted | worker | 136009123xx | null | | row2 | michael | manager | 189422xxxx | null | +-------+----------+-----------+--------------+-------+ |
F: 插入数据、更改数据
插入或者更改数据在phoenix中使用upsert关键字,
如果表中不存在该数据则插入,否则更新
插入:
0:jdbc:phoenix:node01> upsert into "employee" values('row3','billy','worker','1697468xxxx',33); |
修改数据:
0: jdbc:phoenix:node01:2181> upsert into "employee" ("no","tel") VALUES ('row2','1358888xxxx'); |
查询:
0: jdbc:phoenix:node01:2181> select * from "employee"; +-------+----------+-----------+--------------+-------+ | no | name | position | tel | age | +-------+----------+-----------+--------------+-------+ | row1 | ted | worker | 136009123xx | null | | row2 | michael | manager | 13588888888 | null | | row3 | billy | worker | 1697468xxxx | 33 | +-------+----------+-----------+--------------+-------+ 3 rows selected (0.06 seconds)
|
hbase(main):056:0> scan 'employee' ROW COLUMN+CELL row1 column=company:_0, timestamp=1484730892661, value= row1 column=company:name, timestamp=1484730892527, value=ted row1 column=company:position, timestamp=1484730892565, value=worker row1 column=family:tel, timestamp=1484730892661, value=13600912345 row2 column=company:_0, timestamp=1484730892762, value= row2 column=company:name, timestamp=1484730892702, value=michael row2 column=company:position, timestamp=1484730892730, value=manager row2 column=family:tel, timestamp=1484730892762, value=13588888888 row3 column=company:_0, timestamp=1484809036587, value=x row3 column=company:name, timestamp=1484809036587, value=billy row3 column=company:position, timestamp=1484809036587, value=worker row3 column=family:age, timestamp=1484809036587, value=\x80\x00\x00! row3 column=family:tel, timestamp=1484809036587, value=16974681345 |
company:_0这个列是没有值的,这个是Phoenix处于性能方面考虑增加的一个列,不用管这个列。