**Hadoop纵览之(五)数据仓库解决方案Hive**

1. 官网介绍

A data warehouse infrastructure that provides data summarization and ad hoc querying.
提供数据汇总和临时查询的一个数据仓库基础设施。

The Apache Hive™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage and queried using SQL syntax.

Apache Hive™数据仓库软件有助于使用SQL语法读取、写入和管理驻留在分布式存储中的大型数据集

Built on top of Apache Hadoop™, Hive provides the following features:
Tools to enable easy access to data via SQL, thus enabling data warehousing tasks such as extract/transform/load (ETL), reporting, and data analysis.
A mechanism to impose structure on a variety of data formats
Access to files stored either directly in Apache HDFS™ or in other data storage systems such as Apache HBase™
Query execution via Apache Tez™, Apache Spark™, or MapReduce
Procedural language with HPL-SQL
Sub-second query retrieval via Hive LLAP, Apache YARN and Apache Slider.

基于Apache的Hadoop™,Hive提供了以下特点:
支持通过SQL轻松访问数据的工具,从而支持数据仓库任务,如提取/转换/加载(ETL)、报告和数据分析。
将结构强加于各种数据格式的一种机制
可以访问直接存储在Apache HDFS™或其他数据存储系统,如Apache HBase™上的文件
查询执行通过Apache Tez™、Apache Spark™或MapReduce
使用HPL-SQL的过程语言
通过Hive LLAP、Apache YARN和Apache Slider进行亚秒查询检索。

2.Hive由来

2.1 Hive是怎么出现的?

1.在大数据技术出现之前,传统的数据分析大多是用什么工具来实现的?
答案:sql 关系型数据库

2.这种工具相对MapReduce这中方式来说有什么优点?
答案:不用进行思维转换,同时也更加接近人类语言,使用人群较大

3.能不能把这种工具通过某种方式跟hadoop结合起来,实现用原来处理问题的思维来处理海量数据?
答案:能,这个东西就是Hive
在这里插入图片描述

2.2 Hive是什么

Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性,因此使用Hive构建的数据仓库也秉承了这些特性。
简单来说,Hive就是在Hadoop上架了一层SQL接口,可以将SQL翻译成MapReduce去Hadoop上执行,这样就使得数据开发和分析人员很方便的使用SQL来完成海量数据的统计和分析,而不必使用编程语言开发MapReduce那么麻烦。
Hive就是我们所说的使用传统的sql来分析海量数据的工具。
可以把Hive当成一个“数据库”,它也具备传统数据库的数据单元,数据库(Database/Schema)和表(Table).但实际上只是Hadoop上的一个工具。

所以从技术角度来看:
hive就是一个翻译器,将传统的sql转化成MapReduce。
或者说:hive是基于MapReduce 的一个上层数据分析框架

2.3 Hive能用来干什么

  • 直接使用hadoop所面临的问题

人员学习成本太高
项目周期要求太短
MapReduce实现复杂查询逻辑开发难度太大

  • 为什么要使用Hive

操作接口采用类SQL语法,提供快速开发的能力。
避免了去写MapReduce,减少开发人员的学习成本。
功能扩展很方便。

  • Hive的两个组成部分:

1.基于MapReduce
2.使用传统sql的编程思想

所以结合Hive的两大主要组件来看,Hive的用处如下:

Hive能够用来进行海量数据的存储、查询和离线分析

2.4 Hive的特点

  • 可扩展

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。

  • 延展性

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

  • 容错

良好的容错性,节点出现问题SQL仍可完成执行。

3.Hive原理

3.1 Hive运行原理

3.1.1Hive架构

在这里插入图片描述
在这里插入图片描述

3.1.2 Hive执行流程

编译器将一个Hive Query Language转换操作符,操作符(Operator)是Hive的最小的处理单元,每个操作符代表HDFS的一个操作或者一道MapReduce作业。Hive定义一个处理过程为Operator。
操作符 描述
TableScanOperator ------> 扫描hive表数据
ReduceSinkOperator ------> 创建将发送到Reducer端的<Key,Value>对
JoinOperator ------> Join两份数据
SelectOperator ------> 选择输出列
FileSinkOperator ------> 建立结果数据,输出至文件
FilterOperator ------> 过滤输入数据
GroupByOperator ------> GroupBy语句
MapJoinOperator ------> /*+mapjoin(t) */
LimitOperator ------> Limit语句
UnionOperator ------> Union语句
Hive通过ExecMapper和ExecReducer执行MapReduce任务。

3.2 Hive数据库

Hive中的数据库概念,本质上仅仅是表的一个目录结构或命名空间。

3.2.1Hive的数据单元

Databases:数据库。概念等同于关系型数据库的Schema
Tables:表。概念等同于关系型数据库的表
Partitions:分区。概念类似于关系型数据库的表分区,没有那么多分区类型,只支持固定分区,将同一组数据存放至一个固定的分区中。
Buckets (or Clusters):分桶。同一个分区内的数据还可以细分,将相同的KEY再划分至一个桶中,这个有点类似于HASH分区,只不过这里是HASH分桶,也有点类似子分区吧。

3.2.2管理表(内部表)

Hive会控制表中数据的生命周期,当删除一张管理表时,同时也会删除表中的数据。管理表中的数据不与其他工具共享。

3.2.3外部表

Hive只控制元数据,当删除一张外部表时,只会删除元数据,并不会删除真实数据。外部表中的数据与其他工具共享。

内、外部表的区别:
删除表时:
数据是否共享:
一些HiveQL语法不试用于外部表。

3.2.4分区管理表、分区外部表

Hive中的分区表类型并不复杂,通常以表中的某一个或多个列为分区依据,并创建文件夹,将表中的其他列中的数据放到该文件夹下的数据文件中。
创建分区表的最主要的目的是:快速查询!
分区还可以分为静态分区和动态分区,静态分区的分区字段不能增加,动态分区相反。默认情况下的分区表是静态的。

3.2.5 Hive分桶

Hive以表中的某一列作为分桶的依据,桶的个数有用户设置,如使用用户表中的id字段来划分桶,划分4个桶。Hive会计算分桶列的hash值再以桶的个数取模来计算某条记录属于那个桶。
分桶的优点在于,将数据大致平均的、随机的放入多个桶中,这样方便对海量的数据做抽样调查、分析。

3.3 Hive数据类型

3.3.1基本数据类型

在这里插入图片描述
在这里插入图片描述

3.3.2复杂数据类型在这里插入图片描述

3.3.3文本文件数据编码(分隔符)

在这里插入图片描述

4.Hive Query Lanaguage语法

4.1HQL基本语法

  • Hive脚本注释

hive >- -注释内容

  • Hive的语法规则

Hql语法和数据库表的名字都不区分大小写
Mysql中的表名区分大小写

  • 查看所有库

hive >SHOW DATABASES;

  • 使用(进入)某个库

hive >use 库名;

  • 查看某个库下的所有表

首先进入到某个库中,然后执行下列命令
hive >SHOW TABLES;

4.2Hive数据库相关语法

4.2.1 创建

CREATE DATABASE [IF NOT EXISTS] 数据库名称 [COMMENT ‘注释’];
hive >CREATE DATABASE IF NOT EXISTS log;
hive >CREATE DATABASE result COMMENT ‘this is result db’;
注意:这里COMMENT语句两边加上中括号表示这是一个可选项,即注释可以加也可不加
同样的一个表或者表中的一个列也可以以同样的方式进行添加注释,但是同样都是可选的
注意:同样IF NOT EXISTS关键字也是可选的,但是添加之后如果要创建的表已经存在了就不再创建,也不会报错,
但是如果不加的话,会报如下错误信息:
Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Database log already exists

4.2.2查询数据库信息

DESCRIBE DATABASE [EXTENDED] 数据库名称;
Desc database [EXTENDED] 数据库名称;
注意:添加EXTENDED关键字可以查看更多信息

4.2.3 创建数据库的本质

HDFS上Hive的根目录下新建一个 数据库名.db 的文件夹
注意:默认的default库没有名字,就在根目录下

4.2.4 记录Hive库信息的元数据表

Hive元数据库中的DBS表

4.2.5Hive数据库删除

drop database if exists 库名;
注意:加上if exists 可以防止因库不存在而抛出警告信息,错误信息如下:
FAILED: SemanticException [Error 10072]: Database does not exist: d

注意:默认情况下Hive不允许用户删除一个包含有表(空表也算有表)的数据库,这时候我们需要在结尾加上关键字cascade。即:
hive >drop database if exists 库名 cascade;

如果删除一含有表的库报错信息如下:
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. InvalidOperationException(message:Database log is not empty. One or more tables exist.)

4.3Hive表相关语法

  • 创建表示例如下

    hive >CREATE TABLE log(
    id string COMMENT ‘this is id column’,
    phonenumber bigint,
    mac string,
    ip string,
    url string,
    title string,
    colum1 string,
    colum2 string,
    colum3 string,
    upflow int,
    downflow int
    )
    COMMENT ‘this is log table’
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
    LINES TERMINATED BY ‘\n’
    stored as textfile;

注意:行与行之间的分隔符目前只支持换行符”\n”,所以一般都省略不写。

  • 创建表的本质:

在表所在的库的目录下新建一个以表名为名字的文件夹

  • 记录Hive中的表的元数据表

Hive元数据库中的TBLS表、COLUMNS_V2、SDS等表

  • Hive表三种添加数据方式

    1.从本地往Hive的log表中添加数据:
    hive >LOAD DATA LOCAL INPATH ‘/home/data/flow.log’ INTO TABLE log1;

    2.从HDFS上往Hive的log表中覆盖数据:
    hive >LOAD DATA INPATH ‘/input/flow.log’OVERWRITE INTO TABLE log2_tmp;

    3.向log表中添加结果集数据:
    hive >INSERT INTO TABLE log3
    select * from log2_tmp;
    注意:如果通过insert的方式覆盖,需要把into直接换成overwrite,跟load方式不同

insert load
INSERT INTO <---->INSERT OVERWRITE INTO TABLE<---->OVERWRITE INTO TABLE

LOCAL关键字
表示使用本地文件系统(会将数据拷贝一份到hive目录中),不写表示使用HDFS(会从HDFS上移动到hive的目录中)
OVERWRITE关键字
表示本次添加将覆盖表中以前的数据,不写表示将进行数据追加

  • 使用Location在创建表指定表数据
    注意:需要提前在HDFS上的 /source 目录下准备好一份日志数据

    hive >CREATE TABLE IF NOT EXISTS log1(
    id string,
    phonenumber bigint,
    mac string,
    ip string,
    url string,
    tiele string,
    colum1 string,
    colum2 string,
    colum3 string,
    upflow int,
    downflow int)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
    stored as textfile
    location ‘/source’;

  • Hive的数据管理模式

关系型数据库的数据管理模式:写时模式,即添加数据的时候就检查数据格式,格式错误无法插入。
Hive的数据管理模式:读时模式,即读取数据的时候才检查数据格式,不匹配返回null。
即:Hive加载数据的时候并不操作或处理数据
所以:Hive可以在建表的时候就指定数据所在的目录
本质:Hive的建表语句就是对文件中的数据的结构的一种描述
原因:Hive的作用是分析海量数据(不需要精确管理)

  • Hive表类型总结
外部表 内部表(管理表)
元数据库中的类型 EXTERNAL _TABLE MANAGED_TABLE
关键字 EXTERNAL
建表示例 create external table t ; create table t ;
删除数据时元数据 被删除 被删除
删除数据时表中的数据 被保留 被删除
适用场景 与其他应用程序共享数据 自己管理数据的生命周期
示例 待分析日志表 源数据日志 日志分析结果表 中间表

注意:
内部表建表时如果需要指定位置请确保指定的位置不被其他人使用,因为内部表删除的时候会将目录和数据同时删除,一般使用内部表时都不指定数据位置。

  • Hive表分区

1.示例

hive >CREATE EXTERNAL TABLE IF NOT EXISTS extpart(
id              string,
phonenumber     bigint,
mac             string,
ip              string,
url            string,
title           string,
colum1          string,
colum2          string,
colum3          string,
upflow          int,
downflow        int
)
PARTITIONED BY (year int,month int,day int)
location '/extpartition';

2、向表中加载数据并进入HDFS查看现象
hive >load data local inpath ‘/root/Desktop/flow.log’
into table extpart
partition (year=2015,month=5,day=24);

3、查看表中的分区
SHOW PARTITIONS 表名;

4.添加分区信息(可以更加方便的分析我们熟悉的文件结构)
hive >ALTER TABLE extpart
hive >ADD PARTITION (year=2015, month=05,day=26)
hive >LOCATION ‘hdfs:///extpartition/2015/05/26’;

5.Hive表动态分区和静态分区

1、 静态分区插入
即:插入的时候就指定分区

静态分区示例
hive >load data local inpath ‘/root/Desktop/flow.log’
hive >into table part
hive >partition (year=2015,month=5,day=24);

2、动态分区插入
即:查询的结果集插入到分区表中,结果集中包含分区字段
动态分区示例
动态分区插入示例
–创建pv表
hive >create table pv(pv int,year int,month int,day int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘,’
location ‘/pv’;
–创建带有分区的pvpart表
hive >create table pvpart(pv int)
PARTITIONED BY (year int,month int,day int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;
–设置Hive动态分区属性
hive >set hive.exec.dynamic.partition=true;
hive >set hive.exec.dynamic.partition.mode=nonstrict;
hive >set hive.exec.max.dynamic.partitions.pernode=100;
–动态分区插入
hive >insert into table pvpart
hive >partition (year,month,day)
hive >select pv,year,month,day
hive >from pv;

  • Hive表分桶

为什么要分桶
单个分区或者表中的数据量越来越大,当分区不能更细粒度的划分数据时,所以会采用分桶技术将数据更加细粒度的划分和管理

分桶的意义
1、为了保存分桶查询结果的分桶结构(数据已经按照分桶字段进行了hash散列)
2、分桶表数据进行抽样和JOIN时可以提高MR程序效率

  • Hive所支持的表操作类型
支持 1.直接往表中加载一个文件中的所有数据 2.往表中加载一个结果集 删除整个表 表结构 支持(最主要)
不支持 Insert into values 方式添加数据 按条件删除 数据