Hive简介

什么是Hive

1)由facebook开源的,最初用于解决海量结构化的日志数据统计问题。

2)构建在Hadoop之上的数据仓库。

3)Hive定义了一种类SQL的查询语言:HQL(类sql但不完全相同),在离线处理的中非常受欢迎,到目前为止还很受欢迎。

4)目前Hive的底层执行引擎有多种:MapReduce、Tez、Spark

Hive on MapReduce

Hive on Tez

Hive on Spark

5)支持多种不同的压缩格式(gzip、lzo、snappy、bzip2)、存储格式(TextFile、SequenceFile、RCFile、ORC、Parquet)以及自定义函数(UDF函数,就是当hive内置函数不能满足我们的需求时,做的补充和扩展)。

为什么要使用Hive(只用写sql就可以完成大数据的计算和查询)

1)简单、容易上手(提供了类似SQL的查询语言HQL)

2)为超大的数据集设计的计算和存储扩展能力(MR计算,HDFS存储)

3)统一的元数据管理(可与Presto/Impala/SparkSql等共享数据)

Hive的架构

《Hive简介》

《Hive简介》

《Hive简介》 hive只需要配置在一个节点就行了,因为他只是个客户端

Hive的环境搭建

下载

版本:hive-1.1.0-cdh5.7.0
安装包下载地址:   http://archive.cloudera.com/cdh5/cdh/5/

下载方式wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.tar.gz

安装

tar -xvf hive-1.1.0-cdh5.7.0.tar.gz

配置环境变量

vi /etc/profile

生效配置文件source /etc/profile

export HIVE_HOME=/usr/hive/hive-1.1.0-cdh5.7.0

export PATH=$HADOOP_HOME/bin:$SPARK_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH

这里需要把hadoop的根目录配置到hive的配置文件里面$HIVE_HOME/conf/hive-env.sh

事先安装mysql服务(远程机器或者本地机器都可以)

在$HIVE_HOME/conf添加hive-site.xml配置

<property>

<name>javax.jdo.option.ConnectionURL</name>

<value>jdbc:mysql://server110:3306/hive?createDatabaseIfNotExist=true</value>

</property>

<property>

<name>javax.jdo.option.ConnectionDriverName</name>

<value>com.mysql.jdbc.Driver</value>

</property>

<property>

<name>javax.jdo.option.ConnectionUserName</name>

<value>root</value>

</property>

<property>

<name>javax.jdo.option.ConnectionPassword</name>

<value>root</value>

</property>

把mysql的驱动mysql-connector-java-5.1.6.jar包放入到$HIVE_HOME/lib下。

启动

$HIVE_HOME/bin/hive

创建表

在hive.apache.org中看到hive wiki,在wiki页面找到DDL那里面详细的介绍的表的各种操作。

create table table_name(col_name data_type [comment col_comment])

例子:创建一个名字为hive_wordcnt的表,一个字段为string类型的名字叫context。

create table hive_wordcnt(context string) ;

查看hive中的所有表:show tables;

查看hive表的内容:select * from hive_wordcnt;

这时候,你肯定会有疑问?

hive创建的表存放在哪里了?答案:他是在hive链接的mysql数据库中,hive实例里面有个tbls表,里面包含了我们建的表信息。表里的字段信息存放在columns_v2表中。

SELECT * FROM tbls

SELECT * FROM columns_v2

如何把hdfs或者本地磁盘的数据文件的数据加载到hive中呐?

答案:在hive的官方网站上hive.apache.org中找到hive wiki页面找到DML里面有加载数据的方式。

结构:LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename 如果是加载本地磁盘的文件需要带上中括号的LOCAL,如果是加载hdfs里的文件就要去掉LOCAL。

Hive 3.0之前的加载操作是纯数据复制/移动操作,可将数据文件移动到与Hive表对应的位置。

filepath可以是:

1)相对路径,如 project/data1

2)一条绝对的道路,如 /user/hive/project/data1

3)带有scheme的完整URI和(可选)权限,例如 hdfs://namenode:9000/user/hive/project/data1

加载hdfs的数据进入hive:

load data inpath ‘hdfs://10.6.24.143:8020/xxx/emp.txt’ into table emp;

加载本地磁盘的数据进入hive:

load data local inpath ‘/usr/hadoop/testdata/partitionerData.txt’ into table hive_wordcnt;

数据加载进来了,我们要hive表里的数据进行计算查看他们的word count的逻辑。sql如下:

select word,count(1) from hive_wordcnt lateral view explode(split(context,’ ‘)) wc  as word group by word; 

lateral view explode():这个函数的意思是把每行记录按照指定分隔符进行拆解。

执行上面的hive sql,就可以会在底层转化成mapreduce作业,并在yarn上运行,如下图:

《Hive简介》

案例操练,加深我们对hive的印象

员工表和部门表的操作:

创建员工表:

DROP TABLE IF EXISTS emp;

create table emp(

empno int,

empname string,

job string,

mgr int,

hiredate string,

sal double,

comm double,

deptno int    

) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;   //这里指定字段与字段之间的分隔符

创建部门表

DROP TABLE IF EXISTS dept;

create table dept(

deptno int,

deptname string,

addr string

) ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;

加载数据到hive表

load data local inpath ‘/usr/hadoop/testdata/emp.txt’ into table emp;

如果数据加载错了,就要重新加载,使用OVERWRITE覆盖关键字

load data local inpath ‘/usr/hadoop/testdata/emp.txt’ OVERWRITE into table emp;

load data local inpath ‘/usr/hadoop/testdata/dept.txt’ into table dept;

查看下两张表的数据是否正常:

《Hive简介》

做个简单的统计

1)求每个部门的人数

select deptno,count(1) from emp group by deptno;

《Hive简介》

2)左链接查询,显示员工的工号、名字、所属部门地址

select p.empno,p.empname,dt.addr from emp p left join dept dt on p.deptno=dt.deptno;

《Hive简介》

删除hive表的数据

delect:用于删除特定行条件

Hive 0.14之前用另外一种方式:insert overwrite table emp select * from emp where empno!=1001;

Hive 0.14开始可以使用DELETE、UPDATE ,删除只能在支持ACID的表上执行。

DELETE FROM tablename [WHERE expression]

TRUNCATE:truncate用于删除所有的行,这个行为在hive元存储删除数据是不可逆的

truncate table tablename;

    原文作者:机灵鬼鬼
    原文地址: https://www.jianshu.com/p/4960319fab60
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞