zoukankan      html  css  js  c++  java
  • [BD] Hive

    简介

    • 基于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保存列的信息

    数据模型

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

    执行Hive查询

    • 执行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 }
    View Code

    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 }
    View Code

    Hive自定义函数

    • 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 }
    View Code

    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 }
    View Code
    • 把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';

    参考

    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/

  • 相关阅读:
    中国天气网数据获取
    雪球数据的定时爬取
    爬虫下载中间件
    简书全站CrawlSpider爬取 mysql异步保存
    房天下新房和二手房
    多线程
    selenium+chromdriver 动态网页的爬虫
    汽车之家下载文件和图片
    re正则
    532.数组中的K-diff数对
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12865929.html
Copyright © 2011-2022 走看看