HADOOP docker:hive简易使用指南
Posted 月饼馅饺子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HADOOP docker:hive简易使用指南相关的知识,希望对你有一定的参考价值。
1.hive简介
1.1 hive组件与相应功能:
1.2 hive的表类型
1.3 分区表
1.3 分隔符
1.4 hive的数据存储
2.数据类型
2.1 基本数据类型
2.1 复杂数据类型
2.3 NULL
3.基本操作
3.1 数据库操作
3.2 表操作
3.3 视图
3.4 数据导入导出
3.hsql
3.1 hsql基本操作
3.2 hive内置函数
3.2 自定义函数
3.3 注册函数
4.hive权限管理
4.1 权限简介
4.2 权限分类
4.3 授权管理
5.hive优化
前言
本手册介绍了hive的基本知识及工作中要注意的要点,适用于hive入门.开发人员请关注hive表操作以及UDF.
1.hive简介
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
1.1 hive组件与相应功能:
- CLI
hive命令行工具,用于执行sql等. - beeline
功能等同于CLI,区别是beeline通过hiveserver2提交请求 - hive metatstore
hive元数据管理服务,客户端工具连接metastroe使用元数据 - hiveserver2
hiveserver2为应用程序提供JDBC接口,例如beeline - hcatalog
hive元数据接口模块
1.2 hive的表类型
- 内部表
内部表:通过指定的元数据格式创建的表,可以指定存储位置\存储格式等,完全由hive来管理.删除内部表时同时删除表数据.当前用sqoop导入的数据都是内部表.
- 外部表
外部表:hdfs上的数据,hive只是对数据做元数据映射来创建表.删除外部表不会删除数据.
1.3 分区表
hive支持分区表,在查询时指定分区字段可以过滤无用分区.分为静态分区和动态分区.
静态分区:
静态分区:指手动创建的分区.在创建表时需要额外
指定分区键,如:create external table if not exists cheap_hotel_user(device string, booking_freq int, book_price string) partitioned by (day string);
或者通过alter table来添加分区:
ALTER TABLE table_name ADD PARTITION (partCol = ‘value1‘) location ‘loc1‘;
动态分区:
动态分区:可以根据指定字段的值自动创建分区(参考ORACLE的数据自动插入到对应分区).默认不开启动态分区,需要修改参数hive.exec.dynamic.partition实现,动态分区上限为10000个.
1.3 分隔符
- 字段分隔符
默认是\001
.在建表时可以指定,如:FIELDS TERMINATED BY ‘\036‘.
注意:不要写成‘\0X1E‘. - 行分隔符
默认是\n
,不可更改.
1.4 hive的数据存储
- 数据存储格式
hive支持Text File\SequenceFile\RCFile\Avro Files\ORC Files\Parquet
以及自定义文件类型.当前使用的是ORC
格式.ORC
格式是一种高性能的带压缩的文件格式,支持多种特性,甚至支持hive的update操作.建表时指定文件格式:"STORED AS ORC
". [点此了解hive文件格式]
2.数据类型
2.1 基本数据类型
类型 | 长度 | 示例 |
---|---|---|
tinyint | 1byte有符号整数 | 20 |
smallint | 2byte有符号整数 | 20 |
int | 4byte有符号整数 | 20 |
bigint | 8byte有符号整数 | 20 |
boolean | 布尔类型,true or flase | TRUE |
float | 单精度浮点数 | 3.14159 |
double | 双精度浮点数 | 3.1415923 |
string | 字符.可以指定字符集,用引号或又引号 | ‘中国‘ "中国" |
date | 日期类型 | ‘2017-03-06‘ |
timestamp | 时间戳.整数 浮点(带纳秒)数或字符串. | 122327493795.123456789 |
2.1 复杂数据类型
类型 | 长度 | 示例 |
---|---|---|
struct | 类似C语言中的结构体 | 如果类型为struct(name string,age int),则可存的值可为 struct(‘bijr‘,3) |
map | 键值对应的组合 | map(k1,v1,k2,v2) |
array | 数组,和java数组一样 | array(‘a‘,‘b‘,‘c‘) |
union | 存储指定类型中的一个或多个 | union(string,int,date)->union(1,‘2017-03-06‘) |
注意:表时不要使用HIVE关键字.
2.3 NULL
NULL代表该字段值是空缺的,查询时显示为‘NULL‘,底层存储为‘\N‘.像其它数据库一样,可以用IS (NOT) NULL来查询.
3.基本操作
3.1 数据库操作
创建数据库
create database [IF NOT EXISTS] simple;
查看数据库
show databases;
删除数据库
drop database [IF EXISTS] simple;
选择数据
use simple;
3.2 表操作
创建内部表
create table [IF NOT EXISTS] test(id int,name string, age int,dt date)
[ROW FORMAT DELIMITED]
[FIELDS TERMINATED BY ‘\001‘]
STORED AS ORC [LOCATION ‘/user/hive/SIMPLE/test‘] ;创建外部表
create
EXTERNAL
table [IF NOT EXISTS] test2(id int,name string, age int,dt date)
FIELDS TERMINATED BY ‘\001‘
LOCATION ‘/tmp/test2‘ ;
注意:在外部表中,location是必须的,分隔符根据文件而定.
创建分区表
CREATE TABLE XDGL_HIS.FLOW_OPINION_ARCH(
serialno string,
opinionno string,
objecttype string
createtime string,
etl_in_dt string)
PARTITIONED BY ( p_day string)
ROW FORMAT DELIMITED
STORED AS ORC
LOCATION ‘/user/hive/S4/CRM_SERVICE_TYPE‘ ;设置动态分区
set hive.exec.dynamic.partition=true;
查看表分区
show partitions XDGL_HIS.FLOW_OPINION_ARCH;
动态分区分区个数默认上限为10000.
从一个表创建另一个表,只创建表结构
create table test2 like test;
create table tests as select * from test where 1=2;查看表信息
desc test;
desc extended test;
desc formatted test;- 重命名表
ALTER TABLE test RENAME TO testtest;
- 重命名表
查询数据
select name,age from test where id =2;
select * from test where id =2;
查询表时,只查需要的列,不要用select *,这样可以减少处理的数据量优化查询速度.删除数据
delete from test where id=2;
增加列
ALTER TABLE test ADD COLUMNS (c1 INT);
注意:增加字段只会在现在有字段后面添加字段.
- 删除列
hive没有删除列的操作.原因是hive只负责管理元数据,并不对HDFS上的文件中的内容做删除.删除列可以用replace实现,实际上就是重建表的元数据.ALTER TABLE test REPLACE COLUMNS (
id int,
name string,
age int,
dt date
);
这样就删除掉了c1字段,实际上并未修改HDFS上的文件.
- 修改字段
alter table test change c1 c2 bigint;
同时修改了字段名和类型.
3.3 视图
视图将查询结果展示给用户,可以屏蔽无用数据.
- 创建视图
create view as
select course, teacher, building
from teaches, teacher_table
where teaches.teacher_id = teacher_table.teacher_id
and teaches.dept_name = ‘CS‘
视图中并不存放数据,只存放元数据.视图在每次被select时都会执行计算,因此可能比较慢.如果不需要实时数据,可以将视图替换会为实体表.
注意:某些组件无法使用hive的视图,比如presto.
3.4 数据导入导出
- 向表中insert数据
insert inito test values(1,‘yangxw‘,20,‘2017-03-07‘);
插入单条数据create table test2 likie test;
insert into test2 select id,name,age,dt from test;
从一个表向另外一个表插入数据insert overwrite table test2 select id,name,age,dt from test;
从一个表向另外一个表插入数据,覆盖原表数据insert overwrite table XDGL_HIS.FLOW_OPINION_ARCH partition(p_day = 2016)
select serialno,opinionno,objecttype,createtime,etl_in_dt from FLOW_OPINION_ARCH_tmp;
覆盖指定分区.
注意:
1.新的hive版本支持insert into value()方式插入单条数据,但速度极慢,可做为测试用.
2.使用insert select 方式插入数据,必须对目标表的所有列提供数据,即不能只对指定列插入数据.如:不支持insert into test2(id ,name) select id,name from test这样.
- 使用load加载数据
标准语法:
LOAD DATA [LOCAL] INPATH ‘filepath‘ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]
加上LOCAL时代表是从本地加载文件,不带LOCAL是从HDFS加载文件.
hive扩展语法(一次插入多表)
FROM from_statement
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 …) [IF NOT EXISTS]] select_statement1
[INSERT OVERWRITE TABLE tablename2 [PARTITION … [IF NOT EXISTS]] select_statement2]
[INSERT INTO TABLE tablename2 [PARTITION …] select_statement2] …;
注意:如果导入的源文件是文本格式,则要替换文本中的 \r \n,否则在hive 的客户端工具中会显示异常.解决办法:导出源文件的脚本中替换\r \n,例如在oracle导出脚本中replace(colun_name,char(10),‘ ‘),replace(colun_name,char(10),‘ ‘)
- 数据导出到本地
标准语法:
INSERT OVERWRITE [LOCAL] DIRECTORY directory1
[ROW FORMAT row_format] [**STORED AS file_format**] (Note: Only available starting with Hive 0.11.0)
SELECT … FROM …
hive扩展语法(导入到多个目录)
FROM from_statement
INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1
[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2] …
支持导出的文件格式:
DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
[NULL DEFINED AS char] (Note: Only available starting with Hive 0.13)
LOCAL时数据导出到本地,不使用LOCAL时导出到HDFS.字段分隔符是 ^A.
- 使用sqoop从ORACLE导数据到hive
sqoop import --connect jdbc:oracle:thin:@//${db_ipaddr}/${db_schema} --username ${db_username} --password ‘${db_passwd}‘ --query " select SERIALNO, OBJECTTYPE, OBJECTNO, FEETYPE, to_char(SYNCHDATE, ‘YYYY-MM-DD HH24:mi:ss‘) as SYNCHDATE from XDGL.ACCT_FEE_ARCH where SYNCHDATE > (TO_DATE(‘${DAY}‘, ‘YYYY-MM-DD‘) -1) and $CONDITIONS " --hcatalog-database STAGE --hcatalog-table ACCT_FEE_ARCH --hcatalog-storage-stanza ‘stored as ORC‘ --hive-partition-key p_day --hive-partition-value ${DAY} --hive-delims-replacement " " -m 1
当前从其它系统同步到大数据平台时,加了ETL_IN_DATE字段来标识导入时间.
注意:使用JDBC导入到hive中时,要替换文本中的 \r \n,否则在hive 的客户端工具中会显示异常.解决办法:导出源文件的脚本中替换\r \n,例如在oracle导出脚本中replace(colun_name,char(10),‘ ‘),replace(colun_name,char(10),‘ ‘)
- 使用sqoop从hive导数据到ORACLE
1. `sqoop export --table tableName2 \ #oracle表`
2. `--connect jdbc:oracle:thin:@127.0.0.1:1521:ORCL \`
3. `--username username \ #oracle用户`
4. `--password password \ #密码`
5. `--hcatalog-database DB1 \ #catalog数据库`
6. `--hcatalog-table tableName2 \ #catalog表`
7. `--hcatalog-partition-keys p_month \ #`
8. `--hcatalog-partition-values 2016-11 \`
9. `--columns "serialno",\`
10. `"contractstatus",\`
11. `"rno",\`
12. `"rname",\`
13. `"stores",\`
14. `"sname",\`
15. `"etl_in_dt"`
3.hsql
hsql的语法和mysql很像,.
3.1 hsql基本操作
大多数时候都可以像使用mysql一样使用hive,以下只列出要注意的地方.
点击查看hive用户手册
点击查看hive select语句文档
SELECT [ALL | DISTINCT] select_expr, select_expr, …
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list [HAVING condition]]
[ CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
group by,Order by, Sort by, Cluster by, and Distribute By
group by
和其它数据库的group by是一样的select sum(amt),city from pos group by city;
order by[aes|desc] [nulls last|nulls first]
对数据做全局排序.因所全局排序,所以只有一个reduce处理数据.
注意:hive中order by 时null值是"最小"的,而oracle中order by 时null值是"最大"的
hive:
hive> select * from tnull order by c ;
2 NULL
1 a
hive> select * from tnull order by c desc;
1 a
2 NULL
oracle:
SQL> select * from tnull order by c ;
ID C
1 aa
2
SQL> select * from tnull order by c desc;
ID C
2
1 aa
sort by
sort by 是在map数据传给reduce之前排序,只能保证map内有序,不能保证全局有序.Distribute By 功能.
控制map数据如果分发给reduce,默认是hash方式.常和sort by 一起使用.Cluster by
同时具有有 sort by \Distribute By 功能.- 子查询
hive支持from where两种子查询:
- 子查询
>SELECT … FROM (subquery) AS name … #from子查询
>SELECT * #where in
>FROM A
>WHERE A.a IN (SELECT foo FROM B);
>SELECT A #where exits(旧版本可能不支持)
>FROM T1
>WHERE EXISTS (SELECT B FROM T2 WHERE T1.X = T2.Y);
注意:hive不支持嵌套子查询,可以改成join来完成
select (select adress from b where b.userid=a.userid) adress from a.
3.2 hive内置函数
hive内置函数包括:操作符\字符串函数\数学函数\日期函数\分析函数(窗口函数)等.具体参考文档.
点击查看hive内置函数
点击查看hive分析函数
3.2 自定义函数
点击查看hive插件开发
创建自定义函数要使用UDF接口:
package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public final class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) { return null; }
return new Text(s.toString().toLowerCase());
}
}
hive中计算的数据往往是巨大的,hive的函数按行数处理,因此不要在自定义函数中再嵌入循环之类的操作,如用jdbc查询另外一个数据库等。
3.3 注册函数
- 临时函数
先执行Add jars
把函数相关的jar包加入到hive中,然后注册:
CREATE TEMPORARY FUNCTION function_name AS class_name;
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
eg:
[[email protected] ~]$ add jar /path/to/lower.jar
hive>create temporary function xxoo_lower as ‘test.ql.LowerUDF‘;
注意:临时函数只在当前session有效,关了这个会话就没了。
- 永久函数
同临时函数一样,也要把函数相关实现打成jar,不同之处是要把jar放到hdfs上
CREATE FUNCTION [db_name.]function_name AS class_name
[USING JAR|FILE|ARCHIVE ``‘file_uri‘` `[, JAR|FILE|ARCHIVE ``‘file_uri‘``] ];
DROP TEMPORARY FUNCTION [IF EXISTS] function_name;
eg:
hdfs dfs -put lower.jar ‘hdfs:///path/to/hive_func‘;
hive> create function xxoo_lower as ‘test.ql.LowerUDF‘ using jar ‘hdfs:///path/to/hive_func/lower.jar‘
4.hive权限管理
默认情况下,hive没有开启权限控制,想要开启权限控制需要设置一些参数.
hive权限的详细操作
4.1 权限简介
hive的权限角色分为:
- 用户
用户即LINUX操作系统用户.hive没有自定义的用户. - 组
组即操作系统上的组.可以对组授权,组内所有用户均获得该权限. - 角色
角色是权限的集合.将角色授权个用户或组,将该用户或组将获得角色的所有权限. - 超级用户
hive需要写代码实现超级用户
4.2 权限分类
4.3 授权管理
拥有相应权限并且有WITH ADMIN OPTION
权限的用户可以授权给别人.比如A用户在表t上有select权限,并且有WITH ADMIN OPTION
权限,那么可以授权给B用户查询t表的权限:
grant select on testdb.test to user B;
- 角色
CREATE ROLE role_name
DROP ROLE role_name
- 角色权限
GRANT ROLE role_name [, role_name] …
TO principal_specification [, principal_specification] …
[WITH ADMIN OPTION]
REVOKE [ADMIN OPTION FOR] ROLE role_name [, role_name] …
FROM principal_specification [, principal_specification] …
principal_specification:
USER user
| GROUP group
| ROLE role
- 授权
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] …
[ON object_specification]
TO principal_specification [, principal_specification] …
[WITH GRANT OPTION]
REVOKE [GRANT OPTION FOR]
priv_type [(column_list)]
[, priv_type [(column_list)]] …
[ON object_specification]
FROM principal_specification [, principal_specification] …
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] …
priv_type:
ALL | ALTER | UPDATE | CREATE | DROP
| INDEX | LOCK | SELECT | SHOW_DATABASE
object_specification:
TABLE tbl_name
| DATABASE db_name
principal_specification:
USER user
| GROUP group
| ROLE role
- 查询用户的权限
SHOW GRANT user|group|role XXX
[ON table|database [(column_list)]]
5.hive优化
hive使用的是mapreduce计算框架,因此优化都是围绕mr来做.具体请参考:
点击查看hive 优化官方文档
以上是关于HADOOP docker:hive简易使用指南的主要内容,如果未能解决你的问题,请参考以下文章
Hadoop-02 基于Hadoop的JavaEE数据可视化简易案例
大数据技术之_03_Hadoop学习_02_入门_Hadoop运行模式+本地运行模式+伪分布式运行模式+完全分布式运行模式(开发重点)+Hadoop编译源码(面试重点)+常见错误及解决方案(示例代(代