一文彻底了解Hive
基本概念
Hive是基于hadoop的一个数据仓库工具,是一种编程接口,处理结构化数据,将结构化的数据文件映射成表,并提供类SQL查询功能。
本质:将HQL转化为MR程序。
优缺点:
优点:采用类SQL语法,易上手;避免写MR程序,减少学习成本;吞吐量大;支持用户自定义函数
缺点:表达能力有限(受限于MR编程模型);调优困难,粒度较粗
Hive架构原理
Hive安装及配置
Hive的安装很简单,解压安装包即可。
Hive需要修改的配置:
hive-env.sh文件
export HADOOP_HOME=/usr/local/src/hadoop-2.10.0
export HIVE_CONF_DIR=/usr/local/src/hive-2.3.6/conf
Hive默认使用第三方的Derby数据库存储元数据,也可以使用MySQL代替Derby。
通过执行bin/hive进去hive的交互式界面,hive的语法和常规的数据库语法非常类似。
使用MySQL替换Derby
直接下载rpm包安装,然后配置hive的配置文件hive-site.xml
<property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://hdp-master1:3306/hive?createDatabaseIfNotExist=true</value><description>JDBC connect string for a JDBC metastore</description></property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.cj.jdbc.Driver</value><description>Driver class name for a JDBC metastore</description></property><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value><description>username to use against metastore database</description></property><property><name>javax.jdo.option.ConnectionPassword</name><value>root</value><description>password to use against metastore database</description></property>
执行./schematool -initSchema -dbType mysql
初始化。
Hive常用交互命令
1、-e 不进入hive的交互窗口执行sql语句
bin/hive -e “select * from stu;”
2、-f 以文件作为参数,执行文件内的sql语句
bin/hive -f ./hive.sql
3、将结果输出到文件中。bin/hive -f ./hive.sql > /home/hadoop/hive_result.txt
Hive数据类型
Hive中的数据类型和MySQL不同,比较类似Java中的数据类型,如字符串类型不是varchar(MySQL)而是string。
基本数据类型
集合数据类型
create table user(name string, friends array<string>, children map<string, int>, address struct<street:string, city:string>)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n'
类型转换
- 自动转换
Hive的原子数据类型支持隐式转换,类似Java的类型转换,并且服从由窄向宽的转换原则,由宽向窄的转换需要使用cast操作。 - 强制转换转换
例如,cast(‘1’ as int)会将字符串‘1’转换成整数1;如果执行cast(‘x’ as int),转换失败,表达式返回NULL。
DDL
Hive的建库建表语句类似传统数据库,但也有不同。
1、建库
create databse db_name (location hdfs_path);//可指定数据库在hdfs的位置,默认会使用hive配置的hdfs文件目录
2、删库
drop database db_name;//空库
drop database db_name cascade;//强制删除
3、建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
管理表(MANAGED_TABLE)
默认创建的表都叫管理表,也称内部表。当我们删除一个管理表时,Hive也会删除这个表中的数据,管理表不适合和其他工具共享数据。
外部表(EXTERNAL_TABLE)
删除外部表,仅删除该表的元数据信息,HDFS中的数据不会被删除。
使用场景
- 外部表:日志数据
- 内部表:统计分析结果
表类型转换:
# 注意区分大小写
#外部表转为内部表
alter table table_name set tblproperties('EXTERNAL'='FALSE');
#内部表转为外部表
alter table table_name set tblproperties('EXTERNAL'='TRUE');
分区表
Hive中的分区就是分目录,在查询时通过where子句中的表达式选择查询指定分区,可以提高查询效率。
创建分区表
create table tb_name(id int, name string)
partitioned by (month string)
row format delimited fields terminated by '\t';
# 向分区表导入数据
hive> load data local inpath './data.txt' into table tb_name partition(month='2020-01');
在使用where子句对分区字段进行过滤时,可以避免全表扫描。
增加分区
1、增加单个分区
alter table tb_name add partition(minth='2020-02');
2、增加多个分区(分隔符号是 ’ ')
alter table tb_name add partition(month='2020-02') partition(month='2020-03');
3、删除分区
alter table tb_name drop partition(month='2020-03');
4、删除多个分区(分隔符号是 ‘,’)
alter table tb_name drop partition(month='2020-03'), partition(month='2020-02');
5、查看分区表有多少分区
show partitions tb_name;
分区表的高级应用
1、二级分区
create table tb_name(id int, name string)
partitioned by (month string, day string)
row format delimited fields terminated by '\t';
2、加载数据
load data local inpath './data.txt' into table tb_name partition(month='2020-01', day='12');
3、查询分区数据
select * from tb_name where month='2020-01' and day='12';
修改表
1、重命名
alter table tb_name rename to new_tb_name;
2、增、删、改列信息
# 更新列
alter table tb_name change old_col_name new_col_name data_type [comment col_comment];
# 添加/替换列(替换是整个表的字段做替换)
alter table tb_name ADD|REPLACE columns (col_name data_type, ...);
DML
从文本中导入数据
1、从本地导入数据,或者从HDFS导入。
load data [local] inpath './data/txt' overwrite | into table tb_name
[partition (part_col='part_col_name', ...)]
2、通过查询语句向表中插入数据
#基本模式(插入或覆盖)
insert into | overwrite table tb_name partition(month='2020-01')
select id, name from tb2_name where month='2020-01';
#多插入模式
from tb2_name
insert overwrite table tb_name partition(month='2020-01')
select id, name where month='2020-02'
insert overwrite table tb_name partition(month='2020-01')select id,name where month='2020-03'
数据导出
Insert导出
1、将查询结果导出
insert overwrite local directory '/dir'
select * from tb_name;
2、将查询结果格式化导出
insert overwrite local directory '/dir'
row format delimited fields terminated by '\t'
select * from tb_name;
Hadoop命令导出到本地
因为数据都保存在HDFS中,所以可以直接使用hadoop的文件系统命令将数据下载下来。
Export导出到HDFS
export table tb_name to '/hdfs_path';
Sqoop导出
Sqoop是一款数据导入导出框架,支持MySQL <==> HDFS。
查询
Hive提供的查询语法和MySQL非常类似,但Hive还提供了一些特殊的功能。
- Like和RLike:匹配类似的值。其中,%代表零个或多个字符;_代表一个字符。RLike是正则匹配,需要提供正则表达式。
select * from tb_name where 'col_name' like 'a%'; select * from tb_name where 'col_name' like 'a_';
- Join:Hive支持等值连接,不支持非等值连接。
- 多表连接:Hive支持类似MySQL中的多表连接,其中每个连接都是一次MR任务。
- order by 和 sort by:order by是对查询结果全局排序,会执行一个单独的reducer任务,sort by是对每个reducer进行一次排序,且sort by通常结合distribute by进行分区排序。
- cluster by:当distribute by和sort by字段相同时,可以使用cluster by替换,但排序只能是升序,不能指定asc或desc。
分桶表
分区针对的是数据的存储路径,分桶针对的是数据文件。分区提供一个隔离数据和优化查询的方式,但并非所有数据集都可形成合理的分区。分桶是将数据集划分成更易管理的若干部分的技术。
- 创建分桶表:
create table tb_name(id int, name string) clustered by(id) into 4 buckets row format delimited fields terminated by '\t';
- 向分桶表导入数据时需要开启分桶配置。
set hive.enforce.bucketing=true set mapreduce.job.reduce=-1 //MR会根据桶的数量分配reducer的数量
- 分桶表通常用于抽样查询。
select * from tb_name tablesmple(bucket 1 out of 4 on id); //tablesample是抽样语句,语法:tablesample(bucket x out of y),其中y必须是table总bucket数的倍数或因子,hive根据y的大小,决定抽样的比例。x表示从哪个bucket开始抽取,必须小于等于y的值。
函数
行转列
concat_ws('seprator', collect_set(cast(col as string)))
将列拼接成行,通常配合group by使用
列转行
//将列转为多个行。
select col1, col2 from tb_name lateral view explode(col_name) t as col2;
窗口函数
over():指定分析函数工作的数据窗口大小,随着行的变化二变化。
例如,有如下数据
要统计4月份的客户名称和总人数
select name,count(*) over() from bus where substring(orderdate, 1, 7) = '2017-04' group by name;
就可以得到想要的结果
over()用于count()这类聚合函数后面,当over()无参数时,代表对整个数据集的每一行数据开窗。
按照日期逐日累加统计
select *, sum(cost) over(order by orderdate) from bus;
分别统计每个人的消费总额
select *,sum(cost) over(distribute by name) from bus;
针对每个人,按照时间累加
//sort by专门用于分区内排序
select *, sum(cost) over(distribute by name sort by orderdate) from stu;
//另一种写法
select *, sum(cost) over(partition by name order by orderdate) from bus;
over函数可用的参数:
current row:当前行
n preceding:往前n行数据
n following:往后n行数据
unbounded:起点,unbounded preceding 表示从前面的起点,unbounded following表示到后面的终点
其他函数:
lag(col, n):往前第n行数据
lead(col, n):往后第n行数据
ntile(n):把有序分区中的行分发到指定数据的组中。
查询每个顾客的明细及上次购买时间
select name, orderdate, cost, lag(orderdate, 1 [, 'default_value']) over(distribute by name sort by orderdate) from bus;
如果要查询下次时间,直接将lag替换为lead。
滑动窗口统计。统计每行数据和前两行数据的和。
select name, orderdate, cost, sum(cost) over(rows between 2 preceding and current row) from bus;
ntile():取前20%的数据
select name, orderdate, cost from
(
select name, orderdate, cost, ntile(5) over(order by orderdate) as nt5
from bus
) t1
where t1.nt5=1;
排名函数
- rank():排序相同时会重复,总数不变
- dense_rank():排序相同时会重复,总数减少
- row_number():根据顺序计算
不妨添加我的微信公众号,每日精品原创干货不容错过。
一文彻底了解Hive相关推荐
- 一文弄懂Hive中谓词下推(on与where的区别)
文章目录 场景模拟 问题描述 Hive谓词下推 谓词下推概念 PPD 配置 基本概念 官网解释 规则总结 规则表 特殊说明 结论 场景模拟 数仓实际开发中经常会涉及到多表关联,这个时候就会涉及到on与 ...
- 一文搞定 Hive 表分隔符
Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格."\t"."\x001″).行分隔符("\n ...
- 一文读懂Hive(架构原理,DDL,常用函数,优化技巧)
1.HIVE简介 1.什么是HIVE hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据: 可以将结构化的数据文件映射为一 ...
- 一文搞定hive之insert into 和 insert overwrite与数据分区
版权声明:本文为博主原创文章,未经博主允许不得转载. 数据分区 数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间,主要包括两种分区形式:水平分区与垂直分区.水平分区是对表 ...
- 一文搞定Hive常用运算和函数
Hive常用运算和函数 关系运算 等值比较: = 不等值比较: <> 小于比较: < 小于等于比较: <= 大于等于比较: >= 空值判断: IS NULL 非空判断: ...
- 使用Ranger对Hive数据进行脱敏
Ranger支持对Hive数据的脱敏处理(Data Masking),它对select的返回结果进行脱敏处理,对用户屏蔽敏感信息. 备注: 该功能针对HiveServer2的场景(如beeline/j ...
- Hive 大数据表性能调优
大数据应用程序开发人员在从 Hadoop 文件系统或 Hive 表读取数据时遇到了挑战. 合并作业(一种用于将小文件合并为大文件的技术)有助于提高读取 Hadoop 数据的性能. 通过合并,文件的数量 ...
- hive-创建数据库-创建表--hive版本3.1.2
1. 数据库 1.1 创建数据库 create database if not exists database_name; 1.2 查看所有的数据库 show databases; 1.3 切换数据库 ...
- 大数据面试之Hive常见题目
大数据面试之Hive常见题目 1. Hive的架构 1.重点四个器:解释器(SQL Parser).Driver:编译器(Compiler),优化器(Optimizer),执行器(Executor) ...
最新文章
- STL--自定义类型的排序
- 【MFC】CWinApp类详解
- typescript tslint rules config
- ​关于深度学习、NLP和计算机视觉的30个顶级Python库
- 课程目标 线程 java 1615387415
- Robotframework--随机选取下拉框的字段值进行搜索
- EasyUI框架分页实现
- 电力电子技术笔记(3)——晶闸管
- 有什么软件可以把音频mp3格式转为文字?
- Jmeter性能测试流程
- 计算机网络 —— 冲突域和广播域
- matlab插值函数 外插,02-函数插值--Matlab插值函数
- 路网自动构建路段拓扑
- 面试官都会问些什么问题?
- Facebook想要成为下一个微信,难! 1
- Thinkpad E450c开启Intel virtual technology
- 2021年我的21个感悟(1/3)
- 计算机与机械专业 有什么大学排名,2017机械排名211大学排名
- 图文结合带你搞懂MySQL日志之Error Log(错误日志)
- 怀旧服最新pve服务器,部落玩家被歧视了?魔兽怀旧服三个PVE服务器,联盟专享占两个...