[BD] Hive
阅读原文时间:2023年07月10日阅读:1

简介

  • 基于HDFS的数据仓库工具

  • 基于HDFS上的数据分析引擎

    • 2.x 前:SQL -----> Hive  ----> MapReduce
    • 2.x 后:推荐执行引擎为 Spark
  • 支持SQL子集

架构

  • 执行方式:CLI、JDBC、HWI(推荐HUE)
  • Hive元信息:表名、列名、列的类型、分区、桶,存储在MySQL中
  • 读取MySQL得到Hive元信息
  • 数据在HDFS中

安装

  • 嵌入模式

  • 不需要MySQL,使用Hive自带的Derby数据库存储元信息(Derby较小,嵌入到Hive中)

  • * 只支持一个连接,用于开发和测试

  • 本地模式

    • 需要MySQL,Hive和MySQL在一起
    • 连接驱动:mysql-connector-java-5.1.43-bin
  • 远程模式

    • 需要MySQL,Hive和MySQL不在一起
    • 在 hive-site.xml 中写入mysql地址
    • mysql中TBLS存储Hive表信息,COLUMNS_2保存列的信息

文件存储

分类

  • 列式存储:每个字段类型相同,数据压缩度高
  • 行式存储:查询快

Hive

  • TEXTFILE:行存储,默认格式,数据不压缩,磁盘开销大
  • ORC:列存储,一个ORC文件分为若干Stripe,一个Stripe分为indexData(列索引),rowData(数据),StripFooter(元数据信息),默认压缩方式zlib
  • PARQUET:列存储,面向分析型业务,以二进制方式存储

性能分析

  • 压缩比:
  • 查询速度

数据模型

  • 内部表:类似MySQL中的表

  • * 导入数据:load(剪切)  
    • 静默模式:hive -S(不打印日志)
  • 分区表:建立分区,提高效率
    • 一个分区对应一个HDFS文件

1 create table emp_part
2 (empno int,
3 ename string,
4 job string,
5 mgr int,
6 hiredate string,
7 sal int,
8 comm int
9 )partitioned by (deptno int)
10 row format delimited fields terminated by ',';

  • * select * from emp_part where deptno=10;
    • 打印执行计划:explain select * from emp_part where deptno=10;
  • 外部表:只定义表结构,数据保存在HDFS的某目录下
  • 桶表:类似Hash分区,对要插入的数据进行hash运算再插入,查询效率提高,插入效率降低
  • 视图:
    • 是一个虚表,查询操作和普通表一样,但不存储数据,数据来自底层依赖的基表
    • 作用:简化复杂的查询(不提高效率)

执行

  • 执行HQL,HQL是SQL的子集
  • 转换为MapReduce程序执行
  • 使用 sqoop 导入 mysql 的数据,或将Hive的数据导出到mysql

JDBC查询

  • 启动 hive thrift 服务

    • hive --server hiveserver2
  • 将hive lib下的jar包下载到本地,添加依赖

JDBCUtils.java

1 package jdbc;
2
3 import java.sql.Connection;
4 import java.sql.DriverManager;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Statement;
8
9 /*
10 * 工具类:
11 * 1、获取数据库Hive链接
12 * 2、释放资源
13 */
14 public class JDBCUtils {
15
16 //Hive数据库的驱动
17 private static String driver = "org.apache.hive.jdbc.HiveDriver";
18
19 //Hive位置
20 private static String url = "jdbc:hive2://192.168.174.111:7777/default";
21
22 //注册驱动
23 static{
24 try {
25 Class.forName(driver);
26 } catch (ClassNotFoundException e) {
27 e.printStackTrace();
28 throw new ExceptionInInitializerError(e);
29 }
30 }
31
32 //获取链接
33 public static Connection getConnection(){
34 try {
35 return DriverManager.getConnection(url);
36 } catch (SQLException e) {
37 e.printStackTrace();
38 }
39 return null;
40 }
41
42 public static void release(Connection conn,Statement st,ResultSet rs){
43 if(rs != null){
44 try {
45 rs.close();
46 } catch (SQLException e) {
47 e.printStackTrace();
48 }finally{
49 rs = null;
50 }
51 }
52
53 if(st != null){
54 try {
55 st.close();
56 } catch (SQLException e) {
57 e.printStackTrace();
58 }finally{
59 st = null;
60 }
61 }
62
63 if(conn != null){
64 try {
65 conn.close();
66 } catch (SQLException e) {
67 e.printStackTrace();
68 }finally{
69 conn = null;
70 }
71 }
72 }
73 }

TestHive.java

1 package jdbc;
2
3 import java.sql.Connection;
4 import java.sql.ResultSet;
5 import java.sql.Statement;
6
7 public class TestHive {
8
9 public static void main(String[] args) {
10 //查询: select * from emp1;
11 Connection conn = null;
12 Statement st = null;
13 ResultSet rs = null;
14 try{
15 conn = JDBCUtils.getConnection();
16 st = conn.createStatement();
17
18 //执行SQL
19 rs = st.executeQuery("select * from emp1");
20 while(rs.next()){
21 String ename = rs.getString("ename");
22 System.out.println(ename);
23 }
24 }catch(Exception ex){
25 ex.printStackTrace();
26 }finally{
27 //释放资源
28 JDBCUtils.release(conn, st, rs);
29 }
30 }
31 }

自定义函数

  • UDF:User Define Function,封装业务逻辑,本质是java程序

MyConcatString

1 package demo.udf;
2
3 import org.apache.hadoop.hive.ql.exec.UDF;
4
5 public class MyConcatString extends UDF{
6 public String evaluate(String a,String b) {
7 return a+"**************"+b;
8 }
9 }

CheckSalaryGrade

1 package demo.udf;
2
3 import org.apache.hadoop.hive.ql.exec.UDF;
4
5 public class CheckSalaryGrade extends UDF{
6 public String evaluate(String salary) {
7 int sal = Integer.parseInt(salary);
8 if(sal < 1000) return "Grade A"; 9 else if(sal>=1000 && sal<3000) return "Grade B";
10 else return "Grade C";
11 }
12 }

  • 把package打包为jar包,上传到/root/tmp

  • 部署jar包

    • 把jar包加入Hive的Classpath

      • add jar /root/tmp/MyUDF.jar;
    • 为自定义函数创建别名

      • create temporary tunction myconcat as 'udf.MyConcatString';
      • create temporary tunction checksal as 'udf.CheckSalaryGrade';

命令

  • 启动:bin/hive
  • 查看库:show databases;
  • 创建库:create database db_hive;
  • 建表:create table school(name string,age int);
  • 插入数据:insert into school(name,age) values("liubei",20);
  • 查看数据:select * from school;
  • 删除表:drop table [table name];
  • 删除表中数据:truncate table [table name];
  • 按分区删除数据:alter table table_name drop partition (partition_name='分区名') 

参考

hive报错

https://blog.csdn.net/qq_40048866/article/details/90041277

https://www.cnblogs.com/lijinze-tsinghua/p/8563054.html

https://blog.csdn.net/SunnyYoona/article/details/51648871

beeline

https://www.cnblogs.com/lenmom/p/11218807.html

https://blog.csdn.net/leanaoo/article/details/83351240

Hive set

https://meihuakaile.github.io/2018/10/19/hive-set%E8%AE%BE%E7%BD%AE/

存储格式

https://www.cnblogs.com/wuxiaolong4/p/11809291.html

https://www.cnblogs.com/wujin/p/6208734.html

应用场景

https://zhuanlan.zhihu.com/p/297769662

Hadoop和数据仓库关系

https://blog.csdn.net/qq_42580464/article/details/80953447

http://www.kokojia.com/article/27501.html

https://www.cnblogs.com/zzjhn/p/10563148.html

http://database.ctocio.com.cn/sjk/2020/0403/15462.html

https://www.zhihu.com/question/19777504