基本概念

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相关推荐

  1. 一文弄懂Hive中谓词下推(on与where的区别)

    文章目录 场景模拟 问题描述 Hive谓词下推 谓词下推概念 PPD 配置 基本概念 官网解释 规则总结 规则表 特殊说明 结论 场景模拟 数仓实际开发中经常会涉及到多表关联,这个时候就会涉及到on与 ...

  2. 一文搞定 Hive 表分隔符

    Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格."\t"."\x001″).行分隔符("\n ...

  3. 一文读懂Hive(架构原理,DDL,常用函数,优化技巧)

    1.HIVE简介 1.什么是HIVE hive是基于Hadoop构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop分布式文件系统中的数据: 可以将结构化的数据文件映射为一 ...

  4. 一文搞定hive之insert into 和 insert overwrite与数据分区

    版权声明:本文为博主原创文章,未经博主允许不得转载. 数据分区 数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间,主要包括两种分区形式:水平分区与垂直分区.水平分区是对表 ...

  5. 一文搞定Hive常用运算和函数

    Hive常用运算和函数 关系运算 等值比较: = 不等值比较: <> 小于比较: < 小于等于比较: <= 大于等于比较: >= 空值判断: IS NULL 非空判断: ...

  6. 使用Ranger对Hive数据进行脱敏

    Ranger支持对Hive数据的脱敏处理(Data Masking),它对select的返回结果进行脱敏处理,对用户屏蔽敏感信息. 备注: 该功能针对HiveServer2的场景(如beeline/j ...

  7. Hive 大数据表性能调优

    大数据应用程序开发人员在从 Hadoop 文件系统或 Hive 表读取数据时遇到了挑战. 合并作业(一种用于将小文件合并为大文件的技术)有助于提高读取 Hadoop 数据的性能. 通过合并,文件的数量 ...

  8. hive-创建数据库-创建表--hive版本3.1.2

    1. 数据库 1.1 创建数据库 create database if not exists database_name; 1.2 查看所有的数据库 show databases; 1.3 切换数据库 ...

  9. 大数据面试之Hive常见题目

    大数据面试之Hive常见题目 1. Hive的架构 1.重点四个器:解释器(SQL Parser).Driver:编译器(Compiler),优化器(Optimizer),执行器(Executor) ...

最新文章

  1. STL--自定义类型的排序
  2. 【MFC】CWinApp类详解
  3. typescript tslint rules config
  4. ​关于深度学习、NLP和计算机视觉的30个顶级Python库
  5. 课程目标 线程 java 1615387415
  6. Robotframework--随机选取下拉框的字段值进行搜索
  7. EasyUI框架分页实现
  8. 电力电子技术笔记(3)——晶闸管
  9. 有什么软件可以把音频mp3格式转为文字?
  10. Jmeter性能测试流程
  11. 计算机网络 —— 冲突域和广播域
  12. matlab插值函数 外插,02-函数插值--Matlab插值函数
  13. 路网自动构建路段拓扑
  14. 面试官都会问些什么问题?
  15. Facebook想要成为下一个微信,难! 1
  16. Thinkpad E450c开启Intel virtual technology
  17. 2021年我的21个感悟(1/3)
  18. 计算机与机械专业 有什么大学排名,2017机械排名211大学排名
  19. 图文结合带你搞懂MySQL日志之Error Log(错误日志)
  20. 怀旧服最新pve服务器,部落玩家被歧视了?魔兽怀旧服三个PVE服务器,联盟专享占两个...

热门文章

  1. 网页控制430单片机
  2. L1-036 A乘以B Python
  3. 基于SAS对美国新冠数据的分析
  4. CSS实现PNG图片背景透明效果
  5. 《延续香火的理想与普遍绝嗣的现实》
  6. 腹外斜肌(03):负重体旋转
  7. C++ 如何让程序暂停一会儿
  8. 数据分析师,先去考这6 个证书
  9. YouTube-8M 数据集简介
  10. 深入探讨三角函数的命名规范