Phoenix的几种方法调用:
批处理方式
命令行方式
GUI方式
JDBC调用方式
一、批处理方式
1、创建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)
);
2、创建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
3、创建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;
4、执行
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'
结论:
1、之前定义的Primary key 为state,city, 于是Phoenix就把输入的state,city的值拼起来成为rowkey。
2、其他的字段还是按照列名去保存,默认的列族为0。
3、还有一个0:_0这个列是没有值的,这个是Phoenix处于性能方面考虑增加的一个列,不用管这个列。
二、命令行方式
1、执行命令
./sqlline.py node01:2181 可以进入到命令行模式
2、相关命令
开头需要一个感叹号
使用help可以打印出所有命令
!all Execute the specified SQL against all the current
connections
!appconfig Set custom application configuration class name
!autocommit Set autocommit mode on or off
!batch Start or execute a batch of statements
!brief Set verbose mode off
!call Execute a callable statement
!close Close the current connection to the database
!closeall Close all current open connections
!columns List all the columns for the specified table
!commandhandler Add a command handler
!commit Commit the current transaction (if autocommit is off)
!connect Open a new connection to the database
!dbinfo Give metadata information about the database
!describe Describe a table
!dropall Drop all tables in the current database
!exportedkeys List all the exported keys for the specified table
!go Select the current connection
!help Print a summary of command usage
!history Display the command history
-d Print timestamps for each event (default for !history)
-f Print full time date stamps in the US format
-E Print full time date stamps in the European format
-i Print full time date stamps in ISO8601 format
-n Suppresses command numbers
-r Reverses the order of the commands
!importedkeys List all the imported keys for the specified table
!indexes List all the indexes for the specified table
!isolation Set the transaction isolation for this connection
!list List the current connections
!manual Display the SQLLine manual
!metadata Obtain metadata information
!nativesql Show the native SQL for the specified statement
!nickname Create a friendly name for the connection (updates command
prompt)
!outputformat Set the output format for displaying results (table,
vertical, csv, tsv, xmlattrs, xmlelements, json)
!primarykeys List all the primary keys for the specified table
!procedures List all the procedures
!prompthandler Set custom prompt handler class name
!properties Connect to the database specified in the properties file(s)
!quit Exits the program
!readonly Set readonly mode on or off
!reconnect Reconnect to the database
!record Record all output to the specified file
!rehash Fetch table and column names for command completion
!rerun Execute previous command from the history file
!reset Reset a sqlline variable
!rollback Roll back the current transaction (if autocommit is off)
!run Run a script from the specified file
!save Save the current variables and aliases
!scan Scan for installed JDBC drivers
!schemas List all the schemas in the database
!script Start saving a script to a file
!set List / set a sqlline variable
!sql Execute a SQL command
!tables List all the tables in the database
!typeinfo Display the type map for the current connection
!verbose Set verbose mode on
解释:
!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变量
3、建立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是大小写敏感的,并且所有命令都是大写,如果你建的表名没有用双引号括起来,那么无论你输入的是大写还是小写,建立出来的表名都是大写的,如果你需要建立出同时包含大写和小写的表名和字段名,请把表名或者字段名用双引号括起来。
可以建立读写的表或者只读的表,他们的区别如下:
读写表:如果你定义的列簇不存在,会被自动建立出来,并且赋以空值。
只读表:你定义的列簇必须事先存在。
4、建立映射表
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
);
这个语句有几个注意点:
1、IF NOT EXISTS可以保证如果已经有建立过这个表,配置不会被覆盖。
2、作为rowkey的字段用 PRIMARY KEY标定。
3、列簇用 columnFamily.columnName 来表示。
4、family.age 是新增的字段,之前建立测试数据的时候没有建立这个字段的原因是在hbase shell下无法直接写入数字型,使用UPSERT 命令插入数据的时候就可以看到真正的数字型在hbase 下是如何显示的。
5、查询映射表数据
0: jdbc:phoenix:node01> SELECT * FROM "employee";
+-------+----------+-----------+--------------+-------+
| no | name | position | tel | age |
+-------+----------+-----------+--------------+-------+
| row1 | ted | worker | 136009123xx | null |
| row2 | michael | manager | 189422xxxx | null |
+-------+----------+-----------+--------------+-------+
6、入数据、更改数据
插入或者更改数据在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)
7、查询Hbase数据
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处于性能方面考虑增加的一个列,不用管这个列。
参考资料:
https://cloud.tencent.com/developer/article/1779519?areaSource=103001.15&traceId=sP1ZCWjDc2Fe9ovREXEnR
评论