【大数据处理与分析】数据仓库Hive:09 Hive 编程实践

【作者主页】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 作业执行,大大降低了非程序员的使用门槛。

欢迎 点赞👍 | 收藏⭐ | 评论✍ | 关注🤗

相关推荐
麦壳饼18 分钟前
SonnetDB 5.0 正式发布:增强 SQL 与事务,开放九模型 MCP 读写
数据库·人工智能·sql·sonnetdb
Decay__9 小时前
18_MySQL 智能巡检方案 —— 巡检项清单 / 一键巡检脚本 / 健康评分
运维·数据库·sql·mysql·架构
凤凰院凶涛QAQ11 小时前
《MySQL内核拆解:从SQL到InnoDB》(四) : 联合查询 & 视图
数据库·sql·mysql
其实防守也摸鱼13 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
美林数据Tempodata14 小时前
高职大数据技术专业升级的六个落地样本:从产业链需求库到实训室数据链路
大数据·人工智能·数字化转型·产教融合·ai教育
跨境卫士苏苏15 小时前
TikTokShop关联账户认定指引更新跨境代运营团队需要注意哪些管理责任
大数据·人工智能·市场营销·跨境电商·营销策略
迅易科技16 小时前
数据质量治理:从异常告警走向自动化根因诊断
大数据
组工部管理能手李哥16 小时前
一次政务知识库体验:AI回答之外,我更在意那行引用来源
大数据·人工智能·大模型·政务
GrowingIO技术社区17 小时前
SaaS与私有化部署怎么比较?责任、集成与成本
大数据·数据挖掘·产品