在上一篇《大数据(5):MapReduce 编程》中使用 MapReduce 进行了单词统计和年度最高气温查询,这一篇中介绍的 Hive 将大大简化 MapReduce 编程。
一、Hive 是什么
Hive 是一个数据仓库(Data Warehouse)应用工具,架构在 Hadoop 之上(底层数据存储在 HDFS 中),将结构化数据文件映射成一张表,通过 HQL(类 SQL)语句,将 HQL 语句转换为 MapReduce 任务进行运行,对海量结构化的数据进行分析和统计。
Hive 查询操作过程基于 Hadoop MapReduce 的作业执行模型,Hive 将提交的 HQL 语句通过解释器转换为 MapReduce 作业提交到 Hadoop 集群上,这通常有较高的延迟,并且在作业提交和调度的时候需要大量的开销。所以,Hive 并不能在大规模数据集上实现低延迟快速的查询,例如,Hive 在几百 MB 的数据集上执行查询时,一般有分钟级的时间延迟。
因此,Hive 不是关系型数据库,不适合需要低延迟的应用,如联机事务处理(OLTP),不提供实时的查询和基于行级的数据更新操作。
Hive 适合使用的场合是大数据集的批处理作业,例如,网络日志分析、联机分析处理(OLAP)。
Hive总结来说:Hive 依赖于 HDFS 存储数据,并将 HQL 转换成 MapReduce 执行,其实质是一款基于 HDFS,使用 MapReduce 计算的数据仓库工具,目的是在不写 MapReduce 程序的前提下,对存储在 HDFS 中的数据进行分析和管理。
二、Hive 安装
使用的操作系统是 Centos 7。
1、在 Apache Hive 官网下载 Hive。下载后解压:
$ tar -zxvf apache-hive-3.1.2-bin.tar.gz
2、在 /etc/profile
中配置环境变量,并使环境变量生效 source /etc/profile
:
export HIVE_HOME=/soft/hive
export PATH=$PATH:$HIVE_HOME/bin
3、检查是否安装成功
$ hive --version
4、由于 Hive 的元数据数据存储在 MySQL 中,所以还需要安装 MySQL,并且还需要 下载与当前数据库匹配的 MySQL 的驱动程序包:mysql-connector-java-x.y.z.jar
并放在 hive 的 lib 目录中。
5、配置 hive-site.xml
在 hive 的 conf 目录下没有 hive-site.xml 文件,因此需要把 hive-default.xml.template 复制一份,并命名为 hive-site.xml,然后配置 hive-site.xml 文件:
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>12345678</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1:3306/hive?useSSL=false</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>hive.querylog.location</name>
<value>/Users/Downloads/soft_tmp/hive/querylog</value>
<description>Location of Hive run time structured log file</description>
</property>
<property>
<name>hive.server2.logging.operation.log.location</name>
<value>/Users/Downloads/soft_tmp/hive/server2_logs</value>
<description>Top level directory where operation logs are stored if logging functionality is enabled</description>
</property>
<property>
<name>hive.exec.local.scratchdir</name>
<value>/Users/Downloads/soft_tmp/hive</value>
<description>Local scratch space for Hive jobs</description>
</property>
<property>
<name>hive.downloaded.resources.dir</name>
<value>/Users/Downloads/soft_tmp/hive/download</value>
<description>Temporary local directory for added resources in the remote file system.</description>
</property>
6、在 MySQL 中创建存放 Hive 信息的数据库
mysql> create database hive;
注意:这里创建的数据库名称需要和 hive-site.xml 文件中 javax.jdo.option.ConnectionURL
属性配置的数据库名称相同。
7、初始化 Hive 的元数据(表结构)到 MySQL 中。
$ cd /soft/hive/bin
$ schematool -dbType mysql -initSchema
到这里,Hive 就已经安装成功了。直接使用 $ hive
命令进入。
三、Hive 基本使用
1、显示当前数据库
hive> show databases;
OK
default
2、新建一个数据库并使用
hive> create database hive_test;
OK
hive> use hive_test;
OK
3、新建一个 person.txt 文件,准备导入 Hive 中
1,zhangsan,female,20
2,lisi,man,22
3,wangwu,female,24
4,zhaoliu,female,21
5,tianqi,female,19
6,wangba,man,17
4、在 Hive 中新建 person 表,以 ,
分割
hive> create table person(id int, name string, genger string, age int) row format delimited fields terminated by ',';
OK
注意:由于 person.txt 文件中的内容是以 ,
分割,所以建表时的字段分隔符也需要是 ,
。
5、查看表结构
hive> desc person;
OK
id int
name string
genger string
age int
6、加载数据到表中
hive> load data local inpath '/Users/terry-jri/Desktop/person.txt' into table person;
Loading data to table hive_test.person
OK
使用 load data local inpath
是从本地路径加载数据,如果要从 HDFS 上加载数据,则使用 load data inpath
。
7、查询数据
hive> select * from person;
OK
1 zhangsan female 20
2 lisi man 22
3 wangwu female 24
4 zhaoliu female 21
5 tianqi female 19
6 wangba man 17
四、Hive 的数据组织
加载数据到 Hive 之后,再从 HDFS 查看
HDFS可以看出 Hive 中的数据库、表、分区等,都对应 HDFS 上的一个目录。表数据对应 HDFS 对应目录下的文件。
Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式(Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定义格式等。只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
Hive 中包含以下数据模型:
- database:在 HDFS 中表现为 ${hive.metastore.warehouse.dir} 目录下一个文件夹。
- table:在 HDFS 中表现所属 database 目录下一个文件夹。
- external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径。
- partition:在 HDFS 中表现为 table 目录下的子目录。
- bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散列之后的多个文件。
- view:与传统数据库类似,只读,基于基本表创建。
五、单词统计
在上一篇《大数据(5):MapReduce 编程》中使用 MapReduce 进行单词统计,这里使用更简单的方法 Hive 来实现。还是如下的单词文件 word_count.txt。
hello world tom
tom hello world
how are you tom
tom how old are you
首先需要建表
hive> create table doc(line string) row format delimited fields terminated by ',';
把文件加载到 hive 中:
hive> load data local inpath '/Users/Desktop/word_count.txt' into table doc;
检查表中的数据:
hive> select * from doc;
OK
hello world tom
tom hello world
how are you
how old are you
使用 split 函数按照空格切分。
hive> select split(line, ' ') from doc;
OK
["hello","world","tom"]
["tom","hello","world"]
["how","are","you"]
["how","old","are","you"]
split 函数将表中每行内容分割成数组,再使用 explode 函数把数组“炸开”。
hive> select explode(split(line, ' ')) from doc;
OK
hello
world
tom
tom
hello
world
how
are
you
how
old
are
you
使用 group by 按单词分组,并统计每组单词的个数。
hive> select t.word, count(*) from ((select explode(split(line, ' ')) as word from doc) as t) group by t.word;
这将转成 MapReduce 进行,最终结果如下:
OK
are 2
hello 2
how 2
old 1
tom 2
world 2
you 2
同时,如果还想实现 top-n,即查询出现次数最多的前 n 个单词,一些搜索引擎的热词搜索原理就是这些,当然那肯定更复杂,但原理是相同的:
hive> select t.word, count(*) c from ((select explode(split(line, ' ')) as word from doc) as t) group by t.word order by c desc limit 2;
OK
you 2
are 2
可以看出,在上一篇中,需要编程实现的单词统计,在这里只需要一行 HQL 就能完成。
六、年份气温统计
与上一篇《大数据(5):MapReduce 编程》的气温统计相同,已知一些年份每月的气温,需要统计这些年份的最高气温,例如:
1900 30°C
1900 34°C
1900 35°C
1900 35°C
...
1901 32°C
1901 34°C
1901 35°C
1901 36°C
1901 28°C
同样的方法,先建表,然后加载数据到表中:
hive> create table year_temp(year int, temp int) row format delimited fields terminated by ' ';
OK
hive> load data local inpath '/Users/Desktop/temp.txt' into table year_temp;
Loading data to table hive_test.year_temp
OK
查询每一年的最高气温:
hive> select year, max(temp) from year_temp group by year;
OK
1990 35
1991 36
...
2000 34
网友评论