
【作者主页】Francek Chen
【专栏介绍】⌈ ⌈ ⌈大数据技术原理与应用 ⌋ ⌋ ⌋专栏系统介绍大数据的相关知识,分为大数据基础篇、大数据存储与管理篇、大数据处理与分析篇、大数据应用篇。内容包含大数据概述、大数据处理架构Hadoop、分布式文件系统HDFS、分布式数据库HBase、NoSQL数据库、云数据库、MapReduce、Hadoop再探讨、数据仓库Hive、Spark、流计算、Flink、图计算、数据可视化,以及大数据在互联网领域、生物医学领域的应用和大数据的其他应用。
【GitCode】专栏资源保存在我的GitCode仓库:https://gitcode.com/Morse_Chen/BigData_principle_application。
文章目录
-
- [一、Hive 的数据类型](#一、Hive 的数据类型)
- [二、Hive 基本操作](#二、Hive 基本操作)
- [三、Hive 应用实例:WordCount](#三、Hive 应用实例:WordCount)
- [四、Hive 编程的优势](#四、Hive 编程的优势)
- 小结
本文首先介绍 Hive 的数据类型,然后介绍 Hive 的基本操作,最后,给出一个 WordCount 应
用实例,并简单分析 Hive 与 MapReduce 在执行 WordCount 时的区别。
一、Hive 的数据类型
Hive 支持关系数据库中的大多数基本数据类型,同时 Hive 还支持关系数据库中不常出现的 3 种集合数据类型。表1中列举了 Hive 所支持的基本数据类型,包括多种不同长度的整型和浮点型数据类型、布尔类型以及无长度限制的字符串类型等。表2列举了 Hive 中的列所支持的 3 种集合数据类型:ARRAY、MAP、STRUCT。这里需要注意的是,表2的示例实际上调用的是内置函数。
表1 Hive所支持的基本数据类型
| 类型 | 描述 | 示例 |
|---|---|---|
| TINYINT | 1个字节(8位)有符号整数 | 1 |
| SMALLINT | 2个字节(16位)有符号整数 | 1 |
| INT | 4个字节(32位)有符号整数 | 1 |
| BIGINT | 8个字节(64位)有符号整数 | 1 |
| FLOAT | 4个字节(32位)单精度浮点数 | 1.0 |
| DOUBLE | 8个字节(64位)双精度浮点数 | 1.0 |
| BOOLEAN | 布尔类型,true/false | true |
| STRING | 字符串,可以指定字符集 | "jou" |
| TIMESTAMP | 整数、浮点数或者字符串 | 1327882394(Unix新纪元秒) |
| BINARY | 字节数组 | 0,1,0,1,0,1,0,1 |
表2 Hive中的列所支持的3种集合数据类型
| 类型 | 描述 | 示例 |
|---|---|---|
| ARRAY | 一组有序字段,字段的类型必须相同 | Array(1,2) |
| MAP | 一组无序的键/值对,键的类型必须是原子的,值可以是任何数据类型,同一个映射的键和值的类型必须相同 | Map('a',1,'b',2) |
| STRUCT | 一组命名的字段,字段类型可以不同 | Struct('a',1,1,0) |
二、Hive 基本操作
HiveQL 是 Hive 的查询语言,和 SQL 比较类似,对 Hive 的操作都是通过编写 HiveQL 语句来实现的。接下来介绍一下 Hive 中常用的几个基本操作。
1. create:创建数据库、表、视图
(1)创建数据库
① 创建数据库 hive
sql
hive> create database hive;
② 创建数据库 hive,因为 hive 已经存在,所以会抛出异常,加上 if not exists 关键字,则不会抛出异常
sql
hive> create database if not exists hive;
(2)创建表
① 在 hive 数据库中,创建表 usr,含三个属性 id,name,age:
sql
hive> use hive;
hive> create table if not exists usr(id bigint,name string,age int);
② 在 hive 数据库中,创建表 usr,含三个属性 id,name,age,存储路径为"/usr/local/hive/warehouse/hive/usr":
sql
hive> create table if not exists hive.usr(id bigint,name string,age int)
> location '/usr/local/hive/warehouse/hive/usr';
③ 在 hive 数据库中,创建外部表 usr,含三个属性 id、name 和 age,可以读取路径"/usr/local/data"下以","分隔的数据:
sql
hive> create external table if not exists hive.usr(id bigint,name string,age int)
> row format delimited fields terminated by ','
> Location'/usr/local/data';
④ 在 hive 数据库中,创建分区表 usr,含三个属性 id、name 和 age,还存在分区字段 sex:
sql
hive> create table hive.usr(id bigint,name string,age int) partition by (sex boolean);
⑤ 在 hive 数据库中,创建分区表 usr1,它通过复制表 usr 得到:
sql
hive> use hive;
hive> create table if not exists usr1 like usr;
(3)创建视图
创建视图 little_usr,只包含表 usr 中 id 和 age 属性:
sql
hive> create view little_usr as select id,age from usr;
2. drop:删除数据库、表、视图
(1)删除数据库
① 删除数据库 hive,如果不存在会出现警告:
sql
hive> drop database hive;
② 删除数据库 hive,因为有 if exists 关键字,即使不存在也不会抛出异常:
sql
hive> drop database if exists hive;
③ 删除数据库 hive,加上 cascade 关键字,可以删除当前数据库和该数据库中的表:
sql
hive> drop database if exists hive cascade;
(2)删除表
删除 usr 表,如果是内部表,元数据和实际数据都会被删除;如果是外部表,则只删除元数据,不删除实际数据:
sql
hive> drop table if exists usr;
(3)删除视图
删除视图 little_usr:
sql
hive> drop view if exists little_usr;
3. alter:修改数据库、表、视图
(1)修改数据库
为 hive 数据库设置 dbproperties 键值对属性值来描述数据库属性信息:
sql
hive> alter database hive set dbproperties('edited-by'='lily');
(2)修改表
① 重命名 usr 表为 user:
sql
hive> alter table usr rename to user;
② 为 usr 表增加新分区:
sql
hive> alter table usr add if not exists partition(sex=true);
hive> alter table usr add if not exists partition(sex=false);
③ 删除 usr 表中分区:
sql
hive> alter table usr drop if exists partition(sex=true);
④ 把 usr 表中列名 name 修改为 username,并把该列置于 age 列后:
sql
hive>alter table usr change name username string after age;
⑤ 在对 usr 表分区字段之前,增加一个新列 sex:
sql
hive> alter table usr add columns(sex boolean);
⑥ 删除 usr 表中所有字段并重新指定新字段 newid、newname 和 newage:
sql
hive> alter table usr replace columns(newid bigint,newname string,newage int);
⑦ 为 usr 表设置 tblproperties 键值对属性值来描述表的属性信息:
sql
hive> alter table usr set tblproperties('notes'='the columns in usr may be null except id');
(3)修改视图
修改 little_usr 视图元数据中的 tblproperties 属性信息:
sql
hive> alter view little_usr set tblproperties('create_at'='refer to timestamp');
4. show:查看数据库、表、视图
(1)查看数据库
① 查看 Hive 中包含的所有数据库:
sql
hive> show databases;
② 查看 Hive 中以 h 开头的所有数据库:
sql
hive> show databases like'h.*';
(2)查看表和视图
① 查看数据库 hive 中所有表和视图:
sql
hive> use hive;
hive> show tables;
② 查看数据库 hive 中以 u 开头的所有表和视图:
sql
hive> show tables in hive like'u.*';
5. describe:描述数据库、表、视图
(1)描述数据库
① 查看数据库 hive 的基本信息,包括数据库中文件位置信息等:
sql
hive> describe database hive;
② 查看数据库 hive 的详细信息,包括数据库的基本信息及属性信息等:
sql
hive>describe database extended hive;
(2)描述表和视图
① 查看 usr 表和视图 little_usr 的基本信息,包括列信息等:
sql
hive> describe hive.usr;
hive> describe hive.little_usr;
② 查看 usr 表和视图 little_usr 的详细信息,包括列信息、位置信息、属性信息等:
sql
hive> describe extended hive.usr;
hive> describe extended hive.little_usr;
③ 查看 usr 表中列 id 的信息:
sql
hive> describe extended usr.id;
6. load:向表中装载数据
① 把目录'/usr/local/data'下的数据文件中的数据装载进 usr 表并覆盖原有数据:
sql
hive> load data local inpath'/usr/local/data'overwrite into table usr;
② 把目录'/usr/local/data'下的数据文件中的数据装载进 usr 表不覆盖原有数据:
sql
hive> load data local inpath'/usr/local/data'into table usr;
③ 把分布式文件系统目录 hdfs://master_server/usr/local/data 下的数据文件数据装载进 usr 表
并覆盖原有数据:
sql
hive> load data inpath'hdfs://master_server/usr/local/data'overwrite into table usr;
7. select:查询表中数据
该命令和 SQL 语句完全相同这里不赘述。
8. insert:向表中插入数据或从表中导出数据
① 向 usr1 表中插入来自 usr 表的数据并覆盖原有数据:
sql
hive> insert overwrite table usr1
> select * from usr where age=10;
② 向 usr1 表中插入来自 usr 表的数据并追加在原有数据后:
sql
hive> insert into table usr1
> select * from usr where age=10;
三、Hive 应用实例:WordCount
现在我们通过一个实例---词频统计,来深入学习 Hive 的具体使用。首先,创建一个需要分析的输入数据文件,然后编写 HiveQL 语句实现 WordCount 算法,在 Linux 操作系统中实现步骤如下。
(1)创建 input 目录,其中 input 为输入目录,命令如下:
sql
$ cd /usr/local/hadoop
$ mkdir input
(2)在 input 文件夹中创建两个测试文件 file1.txt 和 file2.txt,命令如下:
sql
$ cd /usr/local/hadoop/input
$ echo "hello world" > file1.txt
$ echo "hello hadoop" > file2.txt
(3)进入 hive 命令行窗口,编写 HiveQL 语句实现 WordCount 算法,命令如下:
sql
$ hive
hive> create table docs(line string);
hive> load data inpath 'file:///usr/local/hadoop/input' overwrite into table docs;
hive> create table word_count as
select word, count(1) as count from
(select explode(split(line,' '))as word from docs) w
group by word
order by word;
执行完成后,用 select 语句查看运行结果,如图1所示。

图1 用select语句查看运行结果
四、Hive 编程的优势
词频统计算法是最能体现 MapReduce 思想的算法之一,因此,这里以 WordCount 为例,简单比较一下其在 MapReduce 中的编程实现和在 Hive 中编程实现的不同点(这里假设 Hive 采用 MapReduce 作为执行引擎)。首先,采用 Hive 实现 WordCount 算法需要编写较少量的代码。在 MapReduce 中,WordCount 类由数十行 Java 代码编写而成,而在 Hive 中只需要编写几行代码。其次,在 MapReduce 的实现中,需要编译生成 jar 文件来执行算法,在 Hive 中则不需要。虽然 HiveQL 语句的最终实现需要转换为 MapReduce 作业来执行,但是这些都是由 Hive 框架自动完成的,用户不需要了解具体实现细节。
由上可知,采用 Hive 实现最大的优势是,对于非程序员,不用学习编写复杂的 Java MapReduce 代码了,只需要学习使用简单的 HiveQL 就可以了,而这对于有 SQL 基础的用户而言是非常容易的。
小结
本文系统介绍了 Hive 的数据类型与基本操作,并给出 WordCount 应用实例。Hive 支持关系数据库中的大多数基本数据类型(如 TINYINT、INT、BIGINT、FLOAT、DOUBLE、BOOLEAN、STRING、TIMESTAMP、BINARY),还支持 ARRAY、MAP、STRUCT 三种集合数据类型。Hive 通过 HiveQL 实现数据库、表、视图的创建、删除、修改、查看、描述,以及数据装载、查询、插入导出等操作。在 WordCount 实例中,只需创建 docs 表、装载数据、用 explode 和 split 函数配合 group by 即可完成词频统计。相比 MapReduce 需编写数十行 Java 代码并编译 jar 包,Hive 只需几行 HiveQL,由框架自动转换为 MapReduce 作业执行,大大降低了非程序员的使用门槛。
欢迎 点赞👍 | 收藏⭐ | 评论✍ | 关注🤗
