Apache Hive基础
Hive理论基础
-
1、什么是Hive?
- 基于Hadoop的数据仓库解决方案
- 将结构化的数据文件映射为数据库表
- 提供类sql的查询语句HQL(Hive Query Language)
- Hive让更多人使用Hadoop
- Hive成为Apache顶级项目
- Hive始于2007年的Facebook
- 官网:http://hive.apache.org
- 基于Hadoop的数据仓库解决方案
-
2、Hive的优势和特点
- 提供了一个简单的优化模型
- HQL类SQL语法,简化MR开发
- 支持在不同的计算框架上运行
- 支持在HDFS和HBase上临时查询数据
- 支持用户自定义函数、格式
- 成熟的JDBC和ODBC驱动程序,用于ETL和BI
- 稳定可靠(真实生产环境)的批处理
- 有庞大活跃的社区
-
3、Hive元数据管理
- 记录数据仓库中模型的定义、各层级间的映射关系
- 存储在关系数据库中
- 默认Derby,轻量级内嵌SQL数据库
- Derby非常适合测试和演示
- 存储在.metastore_db目录下
- 实际生产一般存储在MySQL中
- 修改配置文件hive-site.xml
- 默认Derby,轻量级内嵌SQL数据库
- HCatalog
- 将Hive元数据共享给其他应用程序
-
4、Hive体系架构
-
5、Hive Interface -命令窗口模式
- 两种工具:Beeline和Hive命令行(CLI)
- 两种模式:命令行模式和交互模式 - 命令行模式
- 交互模式
- Hive和Beeline区别(Hiveserver和Hiveserver2):
- hive不需要启动服务再访问
- beeline需要先启动服务端,在启动客户端
- beeline在查询效率上比hive高,beeline不支持update和delete
-
6、Hive数据类型
-
原始类型
-
复杂数据类型
- Array:存储的数据为相同类型
- Map:具有相同类型的键值对
- Struct:封装了一组字段
-
-
7、Hive元数据结构
-
8、数据表
- 分为内部表和外部表
- 内部表(管理表)
- HDFS中为所属数据库目录下的子文件夹
- 数据完全由Hive管理,删除表(元数据)会删除数据
- 外部表(External Tables)
- 数据保存在指定位置的HDFS路径中
- Hive不完全管理数据,删除表(元数据)不会删除数据
- 内部表(管理表)
- 内部表和外部表的区别:
- 删除内部表,删除表元数据和数据
- 删除外部表,删除元数据,不删除数据
- 分为内部表和外部表
-
建表语句
create table table_name(... ...) #外部表则加上关键字:external
partitioned by (country string,add string) #以country和add进行分区
row format delimited #把分隔符格式化
fields terminated by '|' #以'|'为列分隔符
collection items terminated by ',' #以','为array的分隔符
map keys terminated by ':' #以':'为map键值的分隔符
lines terminated by '\n'; #行分割
-
建表高阶语句 - CTAS and WITH
- CTAS – as select方式建表
- CREATE TABLE ctas_employee as SELECT * FROM employee;
- CTE (CTAS with Common Table Expression)
- CREATE TABLE cte_employee AS
WITH
r1 AS (SELECT name FROM r2 WHERE name = ‘Michael’),
r2 AS (SELECT name FROM employee WHERE sex_age.sex= ‘Male’),
r3 AS (SELECT name FROM employee WHERE sex_age.sex= ‘Female’)
SELECT * FROM r1 UNION ALL SELECT * FROM r3;
- CREATE TABLE cte_employee AS
- Like
- CREATE TABLE employee_like LIKE employee;
- CTAS – as select方式建表
-
9、Hive分区
- 作用
- 分区列的值将表划分为segments(文件夹)
- 查询时使用“分区”列和常规列类似
- 查询时Hive自动过滤掉不用于提高性能的分区
- 分区操作
- 定义:
- partitioned by ()
- alter table table_name add partition ()
- 插入:
- insert into table_name partition () values()
- load data [local] inpath ‘’ into table_name partition ()
- 定义:
- 分为静态分区和动态分区
- 静态分区操作
- 添加分区:
- ALTER TABLE employee_partitioned ADD PARTITION (year=2019,month=3) PARTITION (year=2019,month=4);
- 注意:添加多个分区时,分区间用空格分隔!!
- 删除分区:
- ALTER TABLE employee_partitioned DROP PARTITION (year=2019,month=3),PARTITION (year=2019, month=4);
- 注意:删除多个分区时,分区间用逗号分隔!!
- 添加分区:
- 动态分区操作
- 使用动态分区需设定属性
- set hive.exec.dynamic.partition=true;
- set hive.exec.dynamic.partition.mode=nonstrict;
- 动态分区设置方法
- insert方式添加动态分区
- 使用动态分区需设定属性
- 静态分区操作
- 作用
-
10、分桶
- 分桶对应于HDFS中的文件
- 更高的查询处理效率
- 是抽样(sampling)更高效
- 根据"桶列"的hash函数将数据进行分桶
- 分桶只要动态分桶
- set hive.enforce.bucketing=true;
- 定义分桶
- clustered by (id) into 2 buckets
- 注意:分桶的列是表中已有的列,分桶数最好是2的n次方
- 必须使用insert方式加载数据
- 分桶对应于HDFS中的文件
-
11、Hive视图(views)
- 试图概述
- 通过隐藏子查询、连接和函数来简化查询的逻辑结构
- 虚拟表,从真实表中选取数据
- 只保存定义,不存储数据
- 如果删除或更改基础表,则查询视图将失败
- 视图是只读的,不能插入或装载数据
- 应用场景
- 将特定的列提供给用户,保护数据隐私
- 查询语句复杂的场景
- Hive视图操作
- 视图操作命令:CREATE、SHOW、DROP、ALTER
- Hive侧视图
- 常与表生成函数结合使用,将函数的输入和输出连接
- OUTER关键字:即使output为空也会生成结果
- select name,work_place,loc from employee lateral view outer explode(split(null,’,’)) a as loc;
- 支持多层级
- select name,wps,skill,score from employee
lateral view explode(work_place) work_place_single as wps
lateral view explode(skills_score) sks as skill,score;
- select name,wps,skill,score from employee
- 通常用于规范化或解析JSON
- 试图概述