Hadoop的数据分析引擎:Hive

时间:2024-04-12 15:15:08
数据分析的引擎:
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的体系结构(画图)
Hadoop的数据分析引擎: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


七、Hive的自定义函数(UDF:user defined function):本质就是一个Java程序
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)自定义的加载函数(最麻烦)