Phoenix的使用方式详解

2021-01-26 11:07:36 浏览数 (1)

本篇博客小菌为大家分享的是关于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 URLjdbc: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
-------------------------

到这里本次的分享就结束了,受益的小伙伴或对大数据技术感兴趣的朋友记得点赞关注小菌吖~~

0 人点赞