什么是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-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的印象
员工表和部门表的操作:
创建员工表:
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;
查看下两张表的数据是否正常:
做个简单的统计
1)求每个部门的人数
select deptno,count(1) from emp group by deptno;
2)左链接查询,显示员工的工号、名字、所属部门地址
select p.empno,p.empname,dt.addr from emp p left join dept dt on p.deptno=dt.deptno;
删除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;