本篇博客小菌为大家分享的是关于Phoenix的使用方式与常用shell。
前文传送门:《Phoenix(凤凰)的安装介绍》
Phoenix使用
先让我们来看看Phoenix的几种方法调用
- 批处理方式
- 命令行方式
- GUI方式
- JDBC调用方式
下面将通过几个实例为大家解释关于这几种方式的使用。
<1>批处理方式
A: 创建user_phoenix.sql文件 内容如下
代码语言:javascript复制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数据文件
代码语言:javascript复制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文件 内容为:
代码语言:javascript复制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: 执行
代码语言:javascript复制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可以打印出所有命令
命令 | 语法解释 |
---|---|
!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
代码语言:javascript复制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: 建立映射表
代码语言:javascript复制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: 查询映射表数据
代码语言:javascript复制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关键字, 如果表中不存在该数据则插入,否则更新 插入:
代码语言:javascript复制0:jdbc:phoenix:node01>
upsert into "employee" values('row3','billy','worker','1697468xxxx',33);
修改数据:
代码语言:javascript复制0: jdbc:phoenix:node01:2181>
upsert into "employee" ("no","tel") VALUES ('row2','1358888xxxx');
查询:
代码语言:javascript复制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)
G: 查询Hbase数据
代码语言:javascript复制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=x80x00x00!
row3 column=family:tel, timestamp=1484809036587, value=16974681345
company:_0这个列是没有值的,这个是Phoenix处于性能方面考虑增加的一个列,不用管这个列。
<3>GUI方式
A: squirrel下载 从网址http://www.squirrelsql.org/下载相应版本的squirrel的安装jar包,比如下载squirrel-sql-3.7-standard.jar window版本。 B: squirrel安装 Window下:通过cmd进入window控制台, 输入 java -jar squirrel-sql-3.7-standard.jar 显示安装界面。
C: squirrel配置连接Phoenix 配置squirrel 解压的phoenix-4.7.0-HBase-1.1-bin.tar.gz包的主目录下将如下几个jar包拷贝到squirrel安装目录的lib下
在安装目录下双击squirrel-sql.bat、点击左侧的Drivers,添加图标
配置说明: 在出现的窗口中填写如下项 Name:就是个名字任意取就可以,这里使用phoenix Example URL :jdbc:phoenix:node01:2181(这里是你的phonenix的jdbc地址,注意端口也可以不写,多个用逗号隔开) Class Name:org.apache.phoenix.jdbc.PhoenixDriver
D: 连接Phoenix 点击Aiiasses,点击右边的添加图标
配置说明:
这里还是名字随意写(这里使用phoenix),driver要选择刚才配置的可用的driver,我们刚才配置的是phoenix url这里就是连接phonex的url选择了phoenix的driver以后自动出现也可以改,user name就是phoenix连接的主机的用户名,密码就是该机器的密码,点击自动登录 然后点击test,显示连接成功即可(在这里最好不要直接点OK,先点Test,连接成功了再OK)
点击OK按钮
查看对应的表
通过sql语句查询数据
<4>JDBC调用方式
打开IDEA建立一个简单的Maven项目 phoenix
pom.xml文件内容:
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast</groupId>
<artifactId>phoenix</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>phoenix</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<version> 4.14.1-HBase-1.2</version>
</dependency>
</dependencies>
</project>
建立一个类 PhoenixManager
代码语言:javascript复制package cn.itcast.phoenix;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class PhoenixManager {
public static void main(String[] args) throws SQLException {
Connection conn=null;
Statement state=null;
ResultSet rs=null;
try {
Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
conn = DriverManager.getConnection("jdbc:phoenix:node01:2181");
state=conn.createStatement();
rs= state.executeQuery("select * from "employee"");
while(rs.next()){
System.out.println("no:" rs.getString("no"));
System.out.println("name:" rs.getString("name"));
System.out.println("position:" rs.getString("position"));
System.out.println("age:" rs.getInt("age"));
System.out.println("-------------------------");
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(rs!=null)rs.close();
if(state!=null) state.close();
if(conn!=null) conn.close();
}
}
}
运行结果展现:
代码语言:javascript复制no:row1
name:ted
position:worker
age:0
-------------------------
no:row2
name:michael
position:manager
age:0
-------------------------
no:row3
name:billy
position:worker
age:33
-------------------------
到这里本次的分享就结束了,受益的小伙伴或对大数据技术感兴趣的朋友记得点赞关注小菌吖~~