Hive介绍


hive整合hadoop hive hadoop_Hive

Hadoop开发存在的问题

只能用java语言开发,如果是c语言或其他语言的程序员用Hadoop,存
在语言门槛。
需要对Hadoop底层原理,api比较了解才能做开发。

Hive概述

Hive是基于Hadoop的一个数据仓库工具。可以将结构化的数据文件映射为
一张表,并提供完整的sql查询功能,可以将 sql语句转换为 MapReduce任
务进行运行。其优点是学习成本低,可以通过类 SQL语句快速实现
MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统
计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,
可以用来进行数据提取、转化、加载( ETL Extract- - Transform- - Load ),
也可以叫做数据清洗,这是一种可以存储、查询和分析存储在 Hadoop 中
的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为
HiveQL,它允许熟悉 SQL 的用户查询数据。

Hive的Hq

HQL - Hive通过类SQL的语法,来进行分布式的计算。HQL用起来和SQL非
常的类似, Hive在执行的过程中会将 HQL转换为 MapReduce去执行,所以
Hive其实是基于Hadoop的一种分布式计算框架,底层仍然是,所以它本质上还是一种离线大数据分析工具。

数据仓库的特征

  1. 数据仓库是多个异构数据源所集成的。
  2. 数据仓库存储的一般是历史数据。 大多数的应用场景是读数据(分析
    数据),所以数据仓库是弱事务的。
  3. 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
  4. 数据仓库是时变的,数据存储从历史的角度提供信息。即数据仓库中的
    关键结构都隐式或显示地包含时间元素。
  5. 数据仓库是弱事务的,因为数据仓库存的是历史数据,一般都读(分
    析)数据场景。

数据库属于OLTP系统。(Online n Transaction Processing)联机事务处
理系统。涵盖了企业大部分的日常操作,如购物、库存、制造、银行、工
资、注册、记账等。比如Mysql,oracle等关系型数据库。

数据仓库属于OLAP系统。(Online l Analytical Processing)联机分析处
理系统。Hive,Hbase等

OLTP是面向用户的、用于程序员的事务处理以及客户的查询处理。
OLAP是面向市场的,用于知识工人(经理、主管和数据分析人员)的数据
分析。

OLAP通常会集成多个异构数据源的数据,数量巨大。
OLTP系统的访问由于要保证原子性,所以有事务机制和恢复机制。
OLAP系统一般存储的是历史数据,所以大部分都是只读操作,不需要事务。

hive整合hadoop hive hadoop_Hive_02

hive整合hadoop hive hadoop_Hive_03

适用场景

Hive 构建在基于静态(离线)批处理的Hadoop 之上,Hadoop 通常都有较
高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不
能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的
数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需
要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵
守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解
释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行
过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,
Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场
合是大数据集的离线批处理作业,例如,网络日志分析。

Hive的安装配置


实现步骤

  1. 安装JDK
  2. 安装Hadoop
  3. 配置JDK和Hadoop的环境变量
  4. 下载Hive安装包
  5. 解压安装hive
  6. 启动Hadoop的HDFS和Yarn
  7. 启动Hive
    进入到bin目录,指定:sh hive (或者执行:./hive)

Hive基础指令

hive整合hadoop hive hadoop_大数据_04


hive整合hadoop hive hadoop_Hive_05


hive整合hadoop hive hadoop_Hive_06


hive整合hadoop hive hadoop_大数据_07


hive整合hadoop hive hadoop_大数据_08


hive整合hadoop hive hadoop_Hive_09

Hive的内部表和外部表

在查看元数据信息时,有一张TBLS表,

其中有一个字段属性:TBL_TYPE——MANAGED_TABLE

MANAGED_TABLE 表示内部表

hive整合hadoop hive hadoop_数据_10

内部表的概念

先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部
文件方式来插入数据),
这样的表称之为hive的内部表。

什么是内部表:现有hive表,再有数据
特点是:当内部表被删除时,对应的HDFS的数据也会被删除掉

外部表的概念

HDFS里已经有数据了,比如有一个2.txt文件,里面存储了这样的一些数据:
1 jary
2 rose
什么是外部表:先有数据,再建立hive表
特点是:删除外部表,但对应的数据依然还在
在实际生产环境下,大多数创建都是外部表
然后,通过hive创建一张表stu来管理这个文件数据。则stu这样表称之为外部表。注意,hive
外部表管理的是HDFS里的某一个目录下的文件数据。
所以,做这个实验,要先HDFS创建一个目录节点,然后把数据文件上传到这个目录节点下。
创建外部表的命令:
进入hive,执行:

create external table stu (id int,name string) row format delimited fields terminated
by ' ' location '/目录路径'

然后查看TBLS表,

hive整合hadoop hive hadoop_Hive_11


hive无论是内部表或外部表,当向HDFS对应的目录节点下追加文件时(只要格式符合),

hive都可以把数据管理进来

内部表和外部标的区别

通过hive执行:drop table stu 。这是删除表操作。如果stu是一个内部表,则HDFS对应的目录
节点会被删除。
如果stu是一个外部表,HDFS对应的目录节点不会删除

Hive分区表

概念

Hive的表有两种,①内部表 ②外部表

此外,内部表和外部表都可以是分区表

分区表的作用:可以避免查询整表,在生产环境下,基本都是建立带有分区字段的表,

在查询时,带上分区条件。

分区表在HDFS,一个分区,就对应一个目录。

分区表的实际应用:一般是以天为单位来建立分区,这样方便管理表数据,

尤其是按日期查询很方便。比如:

hive整合hadoop hive hadoop_大数据_12


普通表和分区表区别:有大量数据增加的需要建分区表

语法

执行:

create table book (id int, name string) partitioned by (category string)
row format delimited fields terminated by '\t';

注:在创建分区表时,partitioned字段可以不在字段列表中。生成的表中自动就会具有该字段。
category 是自定义的字段。

分区表加载数据

load data local inpath '/home/cn.txt' overwrite into table book partition (category='cn');
load data local inpath './book_english.txt' overwrite into table book partition (category='en');

经检查发现分区也是一个目录。

hive整合hadoop hive hadoop_大数据_13

select * from book; //查询book目录下的所有数据
select * from book where category='cn'; //只查询 cn分区的数据

此外,通过查看mysql的SDS表来查询元数据信息

hive整合hadoop hive hadoop_大数据_14

通过创建目录来增加分区

如果想先在HDFS的目录下,自己创建一个分区目录,然后在此目录下上传文件,比如:

hive整合hadoop hive hadoop_数据_15


此时手动创建目录是无法被hive使用的,因为元数据库中没有记录该分区。

如果需要将自己创建的分区也能被识别,

需要执行:ALTER TABLE book add PARTITION (category = ‘fr’) location

‘/user/hive/warehouse/park01.db/book/category=fr’;

这行命令的作用是在元数据Dock表里创建对应的元数据信息

分区命令

  1. 显示分区
show partitions iteblog;
  1. 添加分区
alter table book add partition (category='jp') location
'/user/hive/warehouse/test.db/book/category=jp';

或者:

msck repair table book;
  1. 删除分区
alter table book drop partition(category='cn')
  1. 修改分区
alter table book partition(category='french') rename to partition (category='hh');
Hive 数据类型

常用的基本数据类型

hive整合hadoop hive hadoop_数据_16

复杂数据类型

hive整合hadoop hive hadoop_hive整合hadoop_17

一、数组类型 array

案例一

元数据:

100,200,300
200,300,500

建表语句:

create external table ex(vals array<int>) row format delimited
fields terminated by '\t' collection items terminated by ',' location
'/ex';

查询每行数组的个数,查询语句:

select size(vals) from ex;

注:hive 内置函数不具备查询某个具体行的数组元素。需要自定义函数
来实现,但这样的需求在实际开发里很少,所以不需要在意。

案例二

元数据:

100,200,300 tom,jary
200,300,500 rose,jack

建表语句:

create external table ex1( info1 array<int>, info2 array<string>)
row format delimited fields terminated by '\t' collection items
terminated by ',' location '/ex';

结果:

hive整合hadoop hive hadoop_数据_18

二、map类型

案例一

元数据:

tom,23
rose,25
jary,28

建表语句:

create external table m1 ( vals map<string,int>) row format
delimited fields terminated by '\t' map keys terminated by ','
location '/map';

查询语句:

select vals['tom'] from m1;

hive整合hadoop hive hadoop_Hive_19

案列二

要求查询tom这个人都浏览了哪些网站,并且为null的值不显示
源数据(分隔符为空格):

tom 192.168.234.21
rose 192.168.234.21
tom 192.168.234.22
jary 192.168.234.21
tom 192.168.234.24
tom 192.168.234.21
rose 192.168.234.21
tom 192.168.234.22
jary 192.168.234.21
tom 192.168.234.22
tom 192.168.234.23

建表语句

create external table ex (vals map<string,string>) row format
delimited fields terminated by '/t' map keys terminated by ' '
location '/ex';

注意:map类型,列的分割符必须是\t

查询语句

select vals['tom'] from ex where vals['tom'] is not null;

如果想做去重工作,可以调用distinct内置函数

select distinct(ip) from (select vals['tom'] ip from ex where
vals['tom'] is not null)ex1;
select distinct(vals['tom']) from m2 where vals['tom'] is not null;

hive整合hadoop hive hadoop_hive整合hadoop_20

三、struct 类型

元数据:

tom 23
rose 22
jary 26

建表语句:

create external table ex (vals  struct<name:string,age:int>)row
format delimited collection items terminated by ' ' location
'/ex';

查询语句:

select vals.age from ex where vals.name='tom';
Hive常用字符串操作函数

hive整合hadoop hive hadoop_hive_21


hive整合hadoop hive hadoop_Hive_22


hive整合hadoop hive hadoop_大数据_23


hive整合hadoop hive hadoop_hive整合hadoop_24

Hive explode

explode 命令可以将行数据,按指定规则切分出多行。

案例一,利用split执行切分规则

有如下数据:

100,200,300
200,300,500

要将上面两行数据根据逗号拆分成多行(每个数字占一行)

实现步骤

1.准备元数据

2.上传HDFS,并创建对应的外部表

执行:create external table ex1 (num string) location ‘/ex’;

注:用explode做行切分,注意表里只有一列,并且行数据是string类型,因为只有字符类型

才能做切分。

3.通过explode指令来做行切分

执行:select explode(split(num,',')) from ex1;

hive整合hadoop hive hadoop_hive整合hadoop_25

Hive的UDF

如果hive的内置函数不够用,我们也可以自己定义函数来使用,这样的函数称为
hive的用户自定义函数,简称UDF。

实现步骤:

  1. 新建java工程,导入hive相关包,导入hive相关的lib。
  2. 创建类继承UDF
  3. 自己编写一个evaluate方法,返回值和参数任意。

hive整合hadoop hive hadoop_数据_26

  1. 为了能让mapreduce处理,String要用Text处理。
  2. 将写好的类打成jar包,上传到linux中
  3. 在hive命令行下,向hive注册UDF:add jar /xxxx/xxxx.jar
  4. hive整合hadoop hive hadoop_大数据_27


  5. 在hive命令行下,为当前udf起一个名字:
create temporary function fname as '类的全路径名';

hive整合hadoop hive hadoop_Hive_28

  1. 之后就可以在hql中使用该自定义函数了。
  2. hive整合hadoop hive hadoop_大数据_29