写点什么

大数据开发之离线分析工具 Hive

  • 2022 年 1 月 13 日
  • 本文字数:2449 字

    阅读完需:约 8 分钟

Hive 是 Facebook 为了解决海量日志数据的分析而开发的,后来开源给了 Apache 软件基金会,可见 Apache 软件基金会是个神奇的组织,大数据培训我们之前学过的很多开源工具都有 Apache 软件基金会的身影。

官网定义:

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

此处版本是 Hive-1.0.0

Hive 的几个特点

  1. Hive 最大的特点是通过类 SQL 来分析大数据,而避免了写 MapReduce 程序来分析数据,这样使得分析数据更容易。

  2. 数据是存储在 HDFS 上的,Hive 本身并不提供数据的存储功能

  3. Hive 是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如 MySQL)。

  4. 数据存储方面:它能够存储很大的数据集,并且对数据完整性、格式要求并不严格。

  5. 数据处理方面:因为 Hive 语句最终会生成 MapReduce 任务去计算,所以不适用于实时计算的场景,它适用于离线分析。



Hive 的核心

Hive 的核心是驱动引擎,驱动引擎由四部分组成:

  • 解释器:解释器的作用是将 HiveSQL 语句转换为语法树(AST)。

  • 编译器:编译器是将语法树编译为逻辑执行计划。

  • 优化器:优化器是对逻辑执行计划进行优化。

  • 执行器:执行器是调用底层的运行框架执行逻辑执行计划。

Hive 的底层存储

Hive 的数据是存储在 HDFS 上的,Hive 中的库和表可以看做是对 HDFS 上的数据做的一个映射。所以 HVIE 必须运行在一个 Hadoop 的集群上的

Hive 语句执行过程

Hive 中的执行器,是将最终要执行的 MapReduce 程序放到 YARN 上以一系列 Job 的方式去执行。

Hive 的元数据存储

Hive 的元数据是一般是存储在 MySQL 这种关系型数据库上的,Hive 和 MySQL 之间通过 MetaStore 服务交互。



  • Hive 客户端

Hive 有很多种客户端。

  • cli 命令行客户端:采用交互窗口,用 hive 命令行和 Hive 进行通信。

  • HiveServer2 客户端:用 Thrift 协议进行通信,Thrift 是不同语言之间的转换器,是连接不同语言程序间的协议,通过 JDBC 或者 ODBC 去访问 Hive。

  • HWI 客户端:hive 自带的一个客户端,但是比较粗糙,一般不用。

  • HUE 客户端:通过 Web 页面来和 Hive 进行交互,使用的比较多。

基本的数据类型



DDL 语法

创建数据库

创建一个数据库会在 HDFS 上创建一个目录,Hive 里数据库的概念类似于程序中的命名空间,用数据库来组织表,北京大数据培训在大量 Hive 的情况下,用数据库来分开可以避免表名冲突。Hive 默认的数据库是 default。

创建数据库例子:

hive> create database if not exists user_db;
复制代码


查看数据库定义

hive> describe database user_db;OKuser_db        hdfs://bigdata-51cdh.chybinmy.com:8020/user/hive/warehouse/user_db.db   hadoop  USER
复制代码


user_db 是数据库名

hdfs://bigdata-51cdh.chybinmy.com:8020/user/hive/warehouse/userdb.db 是 userdb 库对应的存储数据的 HDFS 上的根目录。

查看数据库列表

hive> show databases;   OK      user_db default
复制代码


创建数据库

hive> create table if not exists userinfo      > (    >   userid int,    >   username string,    >   cityid int,    >   createtime date        > )    > row format delimited fields terminated by '\t'    > stored as textfile;    OK    Time taken: 2.133 seconds
复制代码


创建分区表

Hive 查询一般是扫描整个目录,但是有时候我们关心的数据只是集中在某一部分数据上,比如我们一个 Hive 查询,往往是只是查询某一天的数据,这样的情况下,可以使用分区表来优化,一天是一个分区,查询时候,Hive 只扫描指定天分区的数据。

普通表和分区表的区别在于:一个 Hive 表在 HDFS 上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的。一个分区一个子目录。主要作用是来优化查询性能。

create table user_action_log(companyId INT comment   '公司ID',userid INT comment   '销售ID',originalstring STRING comment   'url', host STRING comment   'host',absolutepath STRING comment   '绝对路径',query STRING comment   '参数串',refurl STRING comment   '来源url',clientip STRING comment   '客户端Ip',cookiemd5 STRING comment   'cookiemd5',timestamp STRING comment   '访问时间戳')partitioned by (dt string)row format delimited fields terminated by ','stored as textfile;
复制代码


这个例子中,这个日志表以 dt 字段分区,dt 是个虚拟的字段,dt 下并不存储数据,而是用来分区的,实际数据存储时,dt 字段值相同的数据存入同一个子目录中,插入数据或者导入数据时,同一天的数据 dt 字段赋值一样,这样就实现了数据按 dt 日期分区存储。

当 Hive 查询数据时,如果指定了 dt 筛选条件,那么只需要到对应的分区下去检索数据即可,大大提高了效率。所以对于分区表查询时,尽量添加上分区字段的筛选条件。

创建桶表

桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive 就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。举例:

create table user_leads(leads_id string,user_id string,user_id string,user_phone string,user_name string,create_time string)clustered by (user_id) sorted by(leads_id) into 10 buckets row format delimited fields terminated by '\t' stored as textfile;
复制代码


对这个例子的说明:

clustered by 是指根据 userid 的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同 userid 的数据放入同一个桶中。而经销商的订单数据,大部分是根据 user_id 进行查询的。这样大部分情况下是只需要查询一个桶中的数据就可以了。

sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在 join 操作时能获得很高的效率。

into 10 buckets 是指定一共分 10 个桶。

在 HDFS 上存储时,一个桶存入一个文件中,这样根据 user_id 进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。

文章来源:极客运维之家

用户头像

关注尚硅谷,轻松学IT 2021.11.23 加入

还未添加个人简介

评论

发布
暂无评论
大数据开发之离线分析工具Hive