1、Hive ---> 属于Hadoop,支持SQL
Pig ---> 属于Hadoop,支持PigLatin
2、Spark SQL ---> 类似Hive,支持SQL和DSL
3、(了解)Impala
一、什么是Hive?
1、Hive是一个翻译器,SQL ---> Hive引擎 ---> MR程序
2、Hive是构建在HDFS上的一个数据仓库(Data Warehouse)
Hive HDFS
表 目录
分区 目录
数据 文件
桶 文件
3、Hive支持SQL(SQL99标准的一个自子集)
二、Hive的体系结构(画图)
三、安装和配置
tar -zxvf apache-hive-2.3.0-bin.tar.gz -C ~/training/
设置环境变量
HIVE_HOME=/root/training/apache-hive-2.3.0-bin
export HIVE_HOME
PATH=$HIVE_HOME/bin:$PATH
export PATH
核心配置文件: conf/hive-site.xml
1、嵌入模式
(*)不需要MySQL的支持,使用Hive的自带的数据库Derby
(*)局限:只支持一个连接
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby:;databaseName=metastore_db;create=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property>
<name>hive.metastore.local</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>file:///root/training/apache-hive-2.3.0-bin/warehouse</value>
</property>
</configuration>
初始化Derby数据库
schematool -dbType derby -initSchema
日志
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
2、本地模式、远程模式:需要MySQL
(*)MySQL的客户端: mysql front http://www.mysqlfront.de/
(*)重新创建hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/hive?useSSL=false</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hiveowner</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>Welcome_1</value>
</property>
</configuration>
(*)将mysql的jar包放到lib目录下
注意一定要使用高版本的MySQL驱动(5.1.43以上的版本)
(*)初始化MySQL
(*)老版本:当第一次启动HIve的时候 自动进行初始化
(*)新版本:schematool -dbType mysql -initSchema
Starting metastore schema initialization to 2.3.0
Initialization script hive-schema-2.3.0.mysql.sql
Initialization script completed
schemaTool completed
四、Hive的数据模型(最重要的内容) ----> 注意:默认:列的分隔符是tab键(制表符)
测试数据:员工表和部门表
7654,MARTIN,SALESMAN,7698,1981/9/28,1250,1400,30
1、内部表:相当于MySQL的表 对应的HDFS的目录 /user/hive/warehouse
create table emp
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int);
插入数据 insert、load语句(从某个HDFS的目录或者本地Linux的目录上,把数据导入Hive的表 本质ctrl+x)
load data inpath '/scott/emp.csv' into table emp; 导入HDFS的数据
load data local inpath '/root/temp/*****' into table emp; 导入本地Linux的数据
创建表的时候,一定指定分隔符
create table emp1
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int)
row format delimited fields terminated by ',';
创建部门表 并且导入数据
create table dept
(deptno int,
dname string,
loc string)
row format delimited fields terminated by ',';
2、分区表: 可以提高查询的效率的----> 通过查看SQL的执行计划
根据员工的部门号创建分区
create table emp_part
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int)
partitioned by (deptno int)
row format delimited fields terminated by ',';
指明导入的数据的分区(通过子查询导入数据) ----> MapReduce程序
insert into table emp_part partition(deptno=10) select empno,ename,job,mgr,hiredate,sal,comm from emp1 where deptno=10;
insert into table emp_part partition(deptno=20) select empno,ename,job,mgr,hiredate,sal,comm from emp1 where deptno=20;
insert into table emp_part partition(deptno=30) select empno,ename,job,mgr,hiredate,sal,comm from emp1 where deptno=30;
3、外部表:参考讲义P47
create external table students_ext
(sid int,sname string,age int)
row format delimited fields terminated by ','
location '/students1';
补充点知识:Oracle数据库中的外部表
数据有两种加载方式
(1)SQL*Loader
(2)数据泵 Data Pump
4、桶表: 桶是一个文件
(*) 复习:hash分区
(*) 举例:创建一个桶表,根据员工的职位(job)进行分桶
create table emp_bucket
(empno int,
ename string,
job string,
mgr int,
hiredate string,
sal int,
comm int,
deptno int)
clustered by (job) into 4 buckets
row format delimited fields terminated by ',';
需要设置环境变量:set hive.enforce.bucketing = true;
通过子查询插入数据
insert into emp_bucket select * from emp1;
5、视图:view 虚表
(1) 视图不存数据 视图依赖的表叫基表
(2) 操作视图 跟操作表 一样
(3) 视图可以提高查询的效率吗?
不可以、视图是简化复杂的查询
(4) 举例 查询员工信息:部门名称 员工姓名
create view myview
as
select dept.dname,emp1.ename
from emp1,dept
where emp1.deptno=dept.deptno;
(5) 补充:如果视图可以缓存数据 ------> 物化视图(可以缓存数据)
五、Hive的查询:就是SQL:select ---> MapReduce
1、查询所有的员工信息
select * from emp1;
2、查询员工信息:员工号 姓名 薪水
select empno,ename,sal from emp1;
3、多表查询 部门名称 员工姓名
select dept.dname,emp1.ename
from emp1,dept
where emp1.deptno=dept.deptno;
4、子查询:
hive只支持:from和where子句中的子查询
补充:Oracle数据库中的子查询支持:from、where、select、having后面
不能使用子查询:group by
5、条件函数: case .... when ....(Oracle中叫条件表达式)
是标准的SQL语句
就是在SQL中实现一个if else 逻辑
举例:做报表,根据职位给员工涨工资
PRESIDENT 1000
MANAGER 800
其他 400
把涨前、涨后的薪水显示出来
select empno,ename,job,sal,
case job when 'PRESIDENT' then sal+1000
when 'MANAGER' then sal+800
else sal+400
end
from emp1;
补充:Oracle中,条件表达式还有一种方式:decode函数 ---> Oracle自己的语法
六、Hive的Java API:本质就是JDBC程序
1、把lib下jar包
2、启动HiveServer2
3、错误
User: root is not allowed to impersonate anonymous
配置Hadoop中core-site.xml文件,增加如下配置:
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
4、hive早期版本中,还有一种方式 Thrift Client
1、封装业务逻辑
2、举例
(1)实现类似Oracle中的concat函数:拼加字符串
select concat('hello',' world') from dual; -----> 得到 hello world
(2)根据员工的薪水,判断薪水的级别
sal <1000 ----> Grade A
1000<=sal<3000 --> Grade B
sal>=3000 ---> Grade C
3、部署自定义的函数
add jar /root/temp/udf.jar;
为函数创建别名
create temporary function myconcat as 'udf.MyConcatString';
create temporary function checksal as 'udf.CheckSalaryGrade';
4、数据分析引擎:Pig也有自定义函数(三种)
(1)自定义的过滤函数:相当于where条件
(2)自定义的运算函数
(3)自定义的加载函数(最麻烦)