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的一种分布式计算框架,底层仍然是,所以它本质上还是一种离线大数据分析工具。
数据仓库的特征
- 数据仓库是多个异构数据源所集成的。
- 数据仓库存储的一般是历史数据。 大多数的应用场景是读数据(分析
数据),所以数据仓库是弱事务的。 - 数据库是为捕获数据而设计,数据仓库是为分析数据而设计。
- 数据仓库是时变的,数据存储从历史的角度提供信息。即数据仓库中的
关键结构都隐式或显示地包含时间元素。 - 数据仓库是弱事务的,因为数据仓库存的是历史数据,一般都读(分
析)数据场景。
数据库属于OLTP系统。(Online n Transaction Processing)联机事务处
理系统。涵盖了企业大部分的日常操作,如购物、库存、制造、银行、工
资、注册、记账等。比如Mysql,oracle等关系型数据库。
数据仓库属于OLAP系统。(Online l Analytical Processing)联机分析处
理系统。Hive,Hbase等
OLTP是面向用户的、用于程序员的事务处理以及客户的查询处理。
OLAP是面向市场的,用于知识工人(经理、主管和数据分析人员)的数据
分析。
OLAP通常会集成多个异构数据源的数据,数量巨大。
OLTP系统的访问由于要保证原子性,所以有事务机制和恢复机制。
OLAP系统一般存储的是历史数据,所以大部分都是只读操作,不需要事务。
适用场景
Hive 构建在基于静态(离线)批处理的Hadoop 之上,Hadoop 通常都有较
高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 并不
能够在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百MB 的
数据集上执行查询一般有分钟级的时间延迟。因此,Hive 并不适合那些需
要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵
守Hadoop MapReduce 的作业执行模型,Hive 将用户的HiveQL 语句通过解
释器转换为MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行
过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,
Hive 并不提供实时的查询和基于行级的数据更新操作。Hive 的最佳使用场
合是大数据集的离线批处理作业,例如,网络日志分析。
Hive的安装配置
实现步骤
- 安装JDK
- 安装Hadoop
- 配置JDK和Hadoop的环境变量
- 下载Hive安装包
- 解压安装hive
- 启动Hadoop的HDFS和Yarn
- 启动Hive
进入到bin目录,指定:sh hive (或者执行:./hive)
Hive基础指令
在查看元数据信息时,有一张TBLS表,
其中有一个字段属性:TBL_TYPE——MANAGED_TABLE
MANAGED_TABLE 表示内部表
内部表的概念
先在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无论是内部表或外部表,当向HDFS对应的目录节点下追加文件时(只要格式符合),
hive都可以把数据管理进来
内部表和外部标的区别
通过hive执行:drop table stu 。这是删除表操作。如果stu是一个内部表,则HDFS对应的目录
节点会被删除。
如果stu是一个外部表,HDFS对应的目录节点不会删除
概念
Hive的表有两种,①内部表 ②外部表
此外,内部表和外部表都可以是分区表
分区表的作用:可以避免查询整表,在生产环境下,基本都是建立带有分区字段的表,
在查询时,带上分区条件。
分区表在HDFS,一个分区,就对应一个目录。
分区表的实际应用:一般是以天为单位来建立分区,这样方便管理表数据,
尤其是按日期查询很方便。比如:
普通表和分区表区别:有大量数据增加的需要建分区表
语法
执行:
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');
经检查发现分区也是一个目录。
select * from book; //查询book目录下的所有数据
select * from book where category='cn'; //只查询 cn分区的数据
此外,通过查看mysql的SDS表来查询元数据信息
通过创建目录来增加分区
如果想先在HDFS的目录下,自己创建一个分区目录,然后在此目录下上传文件,比如:
此时手动创建目录是无法被hive使用的,因为元数据库中没有记录该分区。
如果需要将自己创建的分区也能被识别,
需要执行:ALTER TABLE book add PARTITION (category = ‘fr’) location
‘/user/hive/warehouse/park01.db/book/category=fr’;
这行命令的作用是在元数据Dock表里创建对应的元数据信息
分区命令
- 显示分区
show partitions iteblog;
- 添加分区
alter table book add partition (category='jp') location
'/user/hive/warehouse/test.db/book/category=jp';
或者:
msck repair table book;
- 删除分区
alter table book drop partition(category='cn')
- 修改分区
alter table book partition(category='french') rename to partition (category='hh');
常用的基本数据类型
复杂数据类型
一、数组类型 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';
结果:
二、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;
案列二
要求查询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;
三、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';
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的内置函数不够用,我们也可以自己定义函数来使用,这样的函数称为
hive的用户自定义函数,简称UDF。
实现步骤:
- 新建java工程,导入hive相关包,导入hive相关的lib。
- 创建类继承UDF
- 自己编写一个evaluate方法,返回值和参数任意。
- 为了能让mapreduce处理,String要用Text处理。
- 将写好的类打成jar包,上传到linux中
- 在hive命令行下,向hive注册UDF:add jar /xxxx/xxxx.jar
- 在hive命令行下,为当前udf起一个名字:
create temporary function fname as '类的全路径名';
- 之后就可以在hql中使用该自定义函数了。