欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hive案例之成绩统计

程序员文章站 2022-03-08 14:28:09
...

Hive案例之成绩统计

需求

​ 创建classrecord.txt文件。其中数据如下:

序号 班级 总分
1 1603A 95 
2 1603B 85
3 1603C 75  
4 1603D 96 
5 1604F 94  
6 1604E 95 
7 1604K 91  
8 1604G 89 
9 1501A 79 
10 1502A 69 
11 1503A 59 
12 1504A 89  
13 1701A 99 
14 1702A 100 
15 1703A 65
  • 创建Hive分区表表名为classrecord导入数据
  • 将以上信息导入到Hive表中
  • 求总分前三名
  • 求每一届的前三名(16xx为16届,15xx为15届,17xx为17届)
  • 创建Hive自定义函数,功能是划定班级类型。
    • 85-100:优秀班级
    • 75-84:良好班级
    • 60-74:及格班级
    • 其余为不合格

实现

  • 创建Hive分区表表名为classrecord导入数据

    • 创建普通表加载数据

      create table classrecord_tmp (id int, classname string, score int) row format delimited fields terminated by ' ' stored as textfile tblproperties('skip.header.line.count'='1');
      
      load data local inpath '/home/test/hive-2.3.7/data/classrecord.txt' into table classrecord_tmp;
      
    • 创建分区表并动态插入数据

      create table classrecord (id int, classname string, score int) partitioned by (dt string) row format delimited fields terminated by ' ';
      
  • 将以上信息导入到Hive表中

    insert into classrecord partition(dt) select *,substr(classname,0,2) dt from classrecord_tmp;
    
  • 求总分前三名

    select * from classrecord order by score desc limit 3;
    
  • 求每一届的前三名(16xx为16届,15xx为15届,17xx为17届)

    select * from (select *,row_number() over(partition by dt order by score desc) rank from classrecord)t where t.rank<=3;
    
  • 创建Hive自定义函数,功能是划定班级类型

    • 导入依赖包

      <dependencies>
      	<dependency>
      		<groupId>org.apache.hive</groupId>
      		<artifactId>hive-exec</artifactId>
      		<version>2.3.7</version>
      	</dependency>
      </dependencies>
      
    • 编写UDF类

      package com.xxx.hive.udf;
      
      import org.apache.hadoop.hive.ql.exec.UDF;
      
      public class LevelUDF extends UDF {
          public String evaluate(Integer score) {
              String level = null;
              if (score >= 85 && score <=100) {
                  level = "优秀";
              } else if (score >= 75 && score < 85){
                  level = "良好";
              } else if (score >= 60 && score < 75) {
                  level = "及格";
              } else {
                  level = "不及格";
              }
              return level;
          }
      }
      
    • 打jar包

    Hive案例之成绩统计

    • 上传到linux

    • 注册函数(二选一)

      • 注册临时函数

        bin/hive中,执行如下语句:

        • 添加jar到classpath中(不论jar是否在hive的lib目录下,都需要执行此语句)

          add jar /home/test/hive-2.3.7/hive_demo-1.0-SNAPSHOT.jar;
          
        • 注册函数

          create temporary function get_level as 'com.xxx.hive.udf.LevelUDF';
          
        • 查看函数

          show functions;
          
        • 使用函数

          select *,get_level(score) from classrecord;
          
        • 删除函数

          drop temporary function get_level;
          
      • 注册永久函数

        • 配置conf/hive-site.xml配置文件,添加如下配置

          <property>
               <name>hive.aux.jars.path</name>
               <value>file:///home/test/hive-2.3.7/hive_demo-1.0-SNAPSHOT.jar</value>
          </property>
          
        • 在bin/hive中,注册永久函数(函数在哪个database注册,就在哪个database中使用和删除)

          create function get_level as 'com.xxx.hive.udf.LevelUDF';
          
        • 在mysql的hive数据库下FUNCS表中查看新注册的函数

          mysql -uroot -pxxxx
          
          use hive
          
          select * from FUNCS;
          
        • 使用函数

          select *,get_level(score) from classrecord;
          
        • 删除函数

          drop function get_level;
          
相关标签: hive 大数据