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:
[hive@hadoop2 ~]$ 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 docker(七):hive权限管理
1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...
- HADOOP docker(四):安装hive
1.hive简介2.安装hive2.1 环境准备2.1.1 下载安装包2.1.2 设置hive用户的环境变量2.1.3 hive服务端配置文件2.1.4 hive客户端配置文件2.1.4 分发hive ...
- docker 安装Hive
转自:https://www.cnblogs.com/upupfeng/p/13452385.html#%E9%83%A8%E7%BD%B2hive 使用docker快速搭建hive环境 记录一下 ...
- 最强最全面的Hive SQL开发指南,超四万字全面解析
本文整体分为两部分,第一部分是简写,如果能看懂会用,就直接从此部分查,方便快捷,如果不是很理解此SQL的用法,则查看第二部分,是详细说明,当然第二部分语句也会更全一些! 第一部分: hive模糊搜索表 ...
- Hadoop 配置好hive,第一次在conf能进入,第二次就不行了,怎么办?
问题描述: 在 Hadoop 配置好 hive 数据仓库,在conf目录下通过hive命令进入hive数据仓库,非常顺利. 但关闭终端,第二次按这种方式却显示,无次命令. 怎么办? 解决办法: 在h ...
- 【SFA官方翻译】使用 Kubernetes、Spring Boot 2.0 和 Docker 的微服务快速指南
[SFA官方翻译]使用 Kubernetes.Spring Boot 2.0 和 Docker 的微服务快速指南 原创: Darren Luo SpringForAll社区 今天 原文链接:https ...
- (第7篇)灵活易用易维护的hadoop数据仓库工具——Hive
摘要: Hive灵活易用且易于维护,十分适合数据仓库的统计分析,什么样的结构让它具备这些特性?我们如何才能灵活操作hive呢? 博主福利 给大家推荐一套hadoop视频课程 [百度hadoop核心架构 ...
- hadoop docker集群搭建
获取镜像 #本机内 docker pull ubuntu:16.04 编排镜像 启动一个容器 #本机内 docker run -i -t --name master ubuntu:16.04 在容器内 ...
- 基于Hadoop的数据仓库Hive
Hive是基于Hadoop的数据仓库工具,可对存储在HDFS上的文件中的数据集进行数据整理.特殊查询和分析处理,提供了类似于SQL语言的查询语言–HiveQL,可通过HQL语句实现简单的MR统计,Hi ...
随机推荐
- iOS11.2-11.3.1进行越狱及问题
设备环境:Electra.iOS11.13.1 PS:Electra最新版本进行越狱只支持11.14以下的版本.同时这是不完美越狱,每次重启手机都需要重新越狱,最后,由于Electra版本推出仓促,一 ...
- Struts2+Spring+Hibernate整合开发(Maven多模块搭建)
Struts2+Spring+Hibernate整合开发(Maven多模块搭建) 0.项目结构 Struts2:web层 Spring:对象的容器 Hibernate:数据库持久化操作 1.父模块导入 ...
- js扩展String.prototype.format字符串拼接的功能
1.题外话,有关概念理解:String.prototype 属性表示 String原型对象.所有 String 的实例都继承自 String.prototype. 任何String.prototype ...
- PHP中使用foreach时加&符号的用法
foreach时加&符号:遍历的同时改变原数组即修改数据或者增加数据. $arr = ['a', 'b', 'c']; foreach ($arr as $key => &$va ...
- Redis总导航目录
NoSQL入门和概述 NoSQL入门概述 3V + 3高 当下的NoSQL经典应用 NoSQL数据模型简介 NoSQL数据库的四大分类 在分布式数据库中CAP原理CAP+BASE Redis入门介绍 ...
- Mysql慢查询开启和查看 ,存储过程批量插入1000万条记录进行慢查询测试
首先登陆进入Mysql命令行 执行sql show variables like 'slow_query%'; 结果为OFF 说明还未开启慢查询 执行sql show varia ...
- log4j配置输出日志文件
在测试程序时,有时候运行一次可能需要很久,把日志文件保存下来是很有必要的,本文给出了scala程序输出日志文件的方式,同时使用本人的另一篇博客中介绍的将log4j.properties放到程序jar包 ...
- QP之QK原理
QK是一个很小的抢占式微内核调度程序,它专用用QP中. QK的思想源于SST,Miro Samek重写了自己前期编的SST(Super Simple Task)代码. QK循环查询AO队列的状态表QK ...
- java 用接口计算圆柱的体积和面积并添加颜色
import java.util.Scanner; class Test { public static void main(String[] args) { fangfa i = new fangf ...
- Vue 生产环境部署
简要:继上次搭建vue环境后,开始着手vue的学习;为此向大家分享从开发环境部署到生产环境(线上)中遇到的问题和解决办法,希望能够跟各位VUE大神学习探索,如果有不对或者好的建议告知下:*~*! 一. ...