栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

hive中的分区表与视图

hive中的分区表与视图

    Hive主要由用户接口模块、驱动模型以及元数据存储模块3个模块组成:

用户接口模块

  用户接口模块包括CLI、Hive网页接口(Hive Web Interface,HWI)、JDBC、ODBC、Thrift Server等,主要实现外部应用对Hive的访问。用户可以使用以下两种方式来操作数据:

CLI (command-line shell):Hive自带的一个命令行客户端工具,用户可以通过Hive命令行的方式来操作数据;HWI (Thrift/JDBC):HWI是Hive的一个简单网页,JDBC、ODBS和Thrift Server可以向用户提供编程访问的接口。用户可以按照标准的JDBC的方式,通过Thrift协议操作数据。

驱动模块

  驱动模块(Driver)包括编译器、优化器、执行器等,所采用的执行引擎可以是 MapReduce、Tez或Spark等。当采用MapReduce作为执行引擎时,驱动模块负责把 HiveQL语句转换成一系列MapReduce作业,所有命令和查询都会进入驱动模块,通过该模块对输入进行解析编译,对计算过程进行优化,然后按照指定的步骤执行。

元数据存储模块

元数据:   元数据(metadata)是 描述数据的数据 ,对于Hive来说,元数据就是用来描述HDFS文件和表的各种对应关系(位置关系、顺序关系、分隔符)。Hive的元数据存储在关系数据库中(Hive内置的是Derby、第三方的是MySQL),HDFS中存储的是数据。在Hive中,所有的元数据默认存储在Hive内置的Derby数据库中,但由于Derby只能有一个实例,也就是说不能有多个命令行客户端同时访问,所以在实际生产环境中,通常使用 MySQL代替Derby。   元数据存储模块(metastore)是一个独立的关系数据库,通常是与MySQL数据库连接后创建的一个MySQL实例,也可以是Hive自带的Derby数据库实例,提供 元数据服务 。元数据存储模块中主要保存表模式和其他系统元数据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据所在位置信息等。它提供给Hive操作管理访问元数据的一个服务,具体操作为metastore对外提供一个服务地址,使客户端能够连接Hive,以此来对元数据进行访问。使用metastore的好处如下:

元数据把数据保存在关系数据库中,Hive提供元数据服务,通过对外的服务地址,用户能够使用客户端连接Hive,访问并操作元数据;支持多个客户端的连接,而客户端无需关心数据的存储地址,实现了数据访问层面的解耦操作。因此如果你在Hive上创建了一张表,然后在presto/impala/sparksql中都是可以直接使用的,它们会从metastore中获取统一的元数据信息,同样的你在presto/impala/sparksql中创建一张表,在Hive中也可以直接使用。

metastore管理元数据的方式:

    内嵌模式   metastore默认的部署模式是metastore元数据服务和Hive服务融合在一起。

  在这种模式下,Hive服务(即Hive驱动本身)、元数据服务metastore,元数据metadata(用于存储映射信息)都在同一个JVM进程中,元数据存储在内置的 Derby数据库 。当启动HiveServer进程时,Derby和metastore都会启动,不需要额外启动metastore服务。但是,一次只能支持一个用户访问,适用于测试场景。

1.本地模式   本地模式与内嵌模式的区别在于:把元数据提取出来,让metastore服务与HiveServer主进程在同一个JVM进程中运行,存储元数据的数据库在单独的进程中运行。元数据一般存储在MySQL关系型数据库中。

 但是,每启动一个Hive服务,都会启动一个metastore服务。多个人使用时,会启用多个metastore服务。

2.远程模式   既然可以把元数据存储给提取出来,也可以考虑把metastore给提取出来变为单独一个进程。把metastore单独进行配置,并在单独的进程中运行,可以保证全局唯一,从而保证数据访问的安全性。(即不随Hive的启动而启动)

  其优点是把metastore服务独立出来,可以安装到远程的服务器集群里,从而解耦Hive服务和metastore服务,保证Hive的稳定运行。

HQL的执行流程

  Hive在执行一条HQL语句时,会经过以下步骤:

    语法解析:Antlr定义SQL的语法规则,完成SQL词法,语法解析,将SQL转化为抽象语法树AST Tree;语义解析:遍历AST Tree,抽象出查询的基本组成单元QueryBlock;生成逻辑执行计划:遍历QueryBlock,翻译为执行操作树OperatorTree;优化逻辑执行计划:逻辑层优化器进行OperatorTree变换,合并不必要的ReduceSinkOperator,减少shuffle数据量;生成物理执行计划:遍历OperatorTree,翻译为MapReduce任务;优化物理执行计划:物理层优化器进行MapReduce任务的变换,生成最终的执行计划。

关于 Hive SQL 的详细工作原理可以参考美团技术团队的文章:HiveQL编译过程

分区表

 概念

Hive 中的表对应为HDFS上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。

分区为HDFS上表目录的子目录,数据按照分区存储在子目录。如果查询的where字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。

这里说明以下分区表并hive独有的概念,实际上这个概念非常常见。比如在我们常用的Oracle数据库中,当表中的数据量不断增大,查询数据的速度就会下降,这时也可以对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据存放到多个表空间(物理文件上),这样查询数据时,就不必要每次都扫描整张表,从而提升查询性能。

使用场景

通常,在管理大规模数据集的时候都需要进行分区,比如将日志文件按天进行分区,从而保证数据细粒度的划分,使得查询性能得到提升。

分区HDFS上表目录的子目录,数据按照分区存储在子目录中。

创建分区表

在Hive中可以使用PARTITIonED BY子句创建分区表。表可以包含一个或多个分区列,程序会为分区列中的每个不同值组合创建单独的数据目录。下面的我们创建一张雇员表作为测试:

CREATE EXTERNAL TABLE emp_partition(
empno Int,
ename STRING,
job STRING,
mgr INT,
hiredate TIMESTAMP,
sal DECIMAL(7,2),
comm DECIMAL(7,2)
)
PARTITIonED BY (deptno INT)  -- 按照部门编号进行分区
ROW FORMAT DELIMITED FIELDS TERMINATED BY "t"
LOCATION '/hive/emp_partition';

加载数据到分区表

加载数据到分区表时候必须要指定数据所处的分区:

# 加载部门编号为20的数据到表中
LOAD DATA LOCAL INPATH "/usr/file/emp20.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=20)
# 加载部门编号为30的数据到表中
LOAD DATA LOCAL INPATH "/usr/file/emp30.txt" OVERWRITE INTO TABLE emp_partition PARTITION (deptno=30)

查看分区目录

这时候我们直接查看表目录,可以看到表目录下存在两个子目录,分别是deptno=20和deptno=30,这就是分区目录,分区目录下才是我们加载的数据文件。

# hadoop fs -ls hdfs://hadoop001:8020/hive/emp_partition/

Hive Views (视图) – Overview

建立视图, CREATE VIEW view_name AS SELECt statement;

建立视图支持 CTE, ORDER BY, LIMIT, JOIN, etc.

查找视图用, SHOW TABLES; (SHOW VIEWS after hive v2.2.0)

显示View定义用, SHOW CREATE TABLE view_name;

删除视图, DROP view_name;

更改视图属性, ALTER VIEW view_name SET TBLPROPERTIES ('comment'='This is a view');

更改视图定义, ALTER VIEW view_name AS SELECT statement;

CREATE EXTERNAL TABLE IF NOT EXISTS employee_external (
name string,
work_place ARRAY,
sex_age STRUCT,
skills_score MAP,
深度之眼 大数据开发实战
Hive Lateral View
Apply table generation function, then join the function input and output together(应用表生成功能,
将功能输入和输出连接在一起)
在一个复杂的SQL查询中,可以生成类似于临时的视图一样的功能。
使用LATERAL VIEW 如果视图是空值的话,那么最终不会有任何输出结果。需要使用LATERAL
VIEW OUT
LATERAL VIEW OUTER
will generate the result even output is null (即使输出为空,LATERAL VIEW OUTER 也会生成结果)
视图为空值,也会展示全部的结果
explode函数的用法:
参数:接受的是一个集合
返回值:返回集合的每一个元素
面试点:Lateral View 和 explode的使用场景
可以基于explode+lateral view 实现词频统计
depart_title MAP>
)
COMMENT 'This is an external table'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|' -- How to separate columns
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE
LOCATION '/hive_stage/employee_external';
--案例
create view employee_external_view as select * from employee_external;
show create table employee_external_view;

侧视图:Lateral View 和 explode的使用场景

1. explode基本的功能
select explode(work_place) from employee_external;
2. 查询客户之前工作过的所有地方
select name, explode(work_place) from employee_external;
-- 通过 lateral view 解决这个问题
select name, addr from employee_external lateral view explode(work_place) r1 as
addr;
-- lateral view 无法解决输出为null的问题
select name, addr from employee_external lateral view explode(split(null,',')) a
as addr;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784115.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号