其他分享
首页 > 其他分享> > Day20:业务分析_学员考勤主题

Day20:业务分析_学员考勤主题

作者:互联网

知识点01:回顾

  1. 拉链表是什么?如何构建拉链表?

    • 拉链表:通过时间来标记变化数据的不同状态
      • startTime:状态开始时间
      • endTime:状态结束时间,最新状态:9999-12-31
    • 步骤
      • step1:增量采集到更新表:ODS
      • step2:更新表与拉链表合并临时表:TMP
        • 修改原有拉链表中的数据:数据发生更新的,并且之前是拉链表最新的状态的数据,endTime修改为当前最新的startTime-1
      • step3:将最新的拉链数据覆盖到拉链表:DW
  2. 报名业务的需求有哪些维度与指标?

    • 指标:报名人数

    • 维度:时间、线上线下、来源渠道、校区、学科、部门

  3. 报名数仓的设计分为几层,每层的功能是什么?

    • ODS:存储原始事务事实表

      • customer_relationship
    • DIM:维度数据层

      • itcast_clazz:班级信息表
        • 校区、学科
      • employee和scrm_deparment
        • 部门
    • DWD:ETL

      • step1:过滤过期的数据,过滤报名数据
      • step2:维度退化,支付时间退化年、月、天、小时
    • DWM:实现了事务事实表与所有维度表的关联

      • 实现4张表的关联
    • DWS:基于小时维度实现各种组合维度的聚合

    • APP:基于更大时间维度对小时维度的结果直接聚合

在这里插入图片描述

  1. Hive是否支持索引?如何实现的?有什么问题?

    • 支持索引机制:0.7 ~ 3.0

    • 通过MapReduce将索引数据存储在一张索引表中

      • 列的值与文件、在文件中的偏移量映射关系
    • 问题:Hive中索引不会自动根据原表的数据进行更新,必须强制手动更新

  2. ORC文件索引分为几种,各自的应用和特点是什么?

    • row group index:范围匹配、存储列的最大值和最小值

    • bloom filter index:等值匹配、存储列的值

  3. Hive中小文件如何处理?有哪些特殊的属性优化?

    • 小文件处理
      • 避免小文件产生:将结果进行小文件合并
      • 如果处理小文件:提前对小文件进行聚合再处理
    • 特殊属性优化
      • 矢量化查询
      • 零拷贝
      • 关联优化器

知识点02:目标

  1. 学员考勤管理
    • 业务需求
      • 为什么要做考勤管理的分析?
      • 指标与维度分别是什么?
    • 数据来源
      • 有哪些表,哪些字段?
    • 数据仓库设计
      • 如何对原始的数据进行处理,得到可以使用的的数据
      • 对转换后的数据再进行聚合
    • 数据仓库实现
  2. Hive中的优化器的选择
    • RBO
    • CBO
  3. 练习:有效线索主题
    • 基于不同维度统计有效线索的个数

知识点03:学员考勤业务需求

知识点04:学员考勤管理数据

4.1 学生打卡信息表

COLUMN_NAMECOLUMN_COMMENT
id主键id
normal_class_flag是否正课 1 正课 2 自习
time_table_id作息时间id 关联 tbh_school_time_table 或者 tbh_class_time_table
class_id班级id
student_id学员id
signin_time签到时间
signin_date签到日期
inner_flag内外网标志 0 外网 1 内网
signin_type签到类型 1 心跳打卡 2 老师补卡
share_state共享屏幕状态 0 否 1是,在上午或下午段有共屏记录,则该段所有记录该字段为1,内网默认为1 外网默认为0
inner_ip内网ip地址

4.2 班级作息时间表

COLUMN_NAMECOLUMN_COMMENT
id主键id
class_id班级id
morning_template_id上午出勤模板id
morning_begin_time上午开始时间
morning_end_time上午结束时间
afternoon_template_id下午出勤模板id
afternoon_begin_time下午开始时间
afternoon_end_time下午结束时间
evening_template_id晚上出勤模板id
evening_begin_time晚上开始时间
evening_end_time晚上结束时间
use_begin_date使用开始日期
use_end_date使用结束日期
create_time创建时间
create_person创建人
remark备注

4.3 班级课表

COLUMN_NAMECOLUMN_COMMENT
idid
base_id课程主表id
class_id班级id
class_date上课日期
content课程内容
teacher_id老师id
teacher_name老师名字
job_number工号
classroom_id教室id
classroom_name教室名称
is_outline是否大纲 0 否 1 是
class_mode上课模式 0 传统全天 1 AB上午 2 AB下午 3 线上直播
is_stage_exam是否阶段考试(0:否 1:是)
is_pay代课费(0:无 1:有)
tutor_teacher_id晚自习辅导老师id
tutor_teacher_name辅导老师姓名
tutor_job_number晚自习辅导老师工号
is_subsidy晚自习补贴(0:无 1:有)
answer_teacher_id答疑老师id
answer_teacher_name答疑老师姓名
answer_job_number答疑老师工号
remark备注
create_time创建时间

4.4 在读学员人数信息表

COLUMN_NAMECOLUMN_COMMENT
id
school_id校区id
subject_id学科id
class_id班级id
studying_student_count在读班级人数
studying_date在读日期

4.5 学生请假申请表

COLUMN_NAMECOLUMN_COMMENT
id序列id
class_id班级id
student_id学员id
audit_state审核状态 0 待审核 1 通过 2 不通过
audit_person审核人
audit_time审核时间
audit_remark审核备注
leave_type请假类型 1 请假 2 销假
leave_reason请假原因 1 事假 2 病假
begin_time请假开始时间
begin_time_type1:上午 2:下午
end_time请假结束时间
end_time_type1:上午 2:下午
days请假/已休天数
cancel_state撤销状态 0 未撤销 1 已撤销
cancel_time撤销时间
old_leave_id原请假id,只有leave_type =2 销假的时候才有
leave_remark请假/销假说明
valid_state是否有效(0:无效 1:有效)
create_time创建时间

在这里插入图片描述

知识点05:数仓设计:ODS与DIM层

知识点06:数仓设计:DWD与DWM层

时间	班级	上午出勤 上午出勤率  上午迟到人数 上午迟到率  上午请假人数 上午请假率 上午旷课人数 上午旷课率
5-14  001	98      98%        10        10%        2         2%         0			
时间	班级	上午出勤人数   上午迟到人数   上午请假人数  上午旷课人数 
 5-14  001	  98          10            2          0	
  - 打卡信息表

  - 请假信息表
  
    |
    
  - 班级出勤状态表
  时间	班级	上午出勤人数   上午迟到人数
        5-14  001	  98          10       
        时间	班级	   上午请假人数  
        5-14  001          2       
        select 
            case 打卡时间 when 上课前40分钟到下课之间  then  出勤
          	when 上课后10分钟到下课之间 then  迟到
            	else 其他
          from ods_student_signin

知识点07:数仓设计:DWS与APP层

知识点08:Hive分析优化器与CBO引擎

知识点09:数仓实现:ODS层与DIM层

        drop table itcast_dimen.class_time_dimen;
        CREATE TABLE IF NOT EXISTS itcast_dimen.class_time_dimen (
            id                     int,
            class_id              int              comment '班级id',
            morning_template_id   int              comment '上午出勤模板id',
            morning_begin_time    STRING         comment '上午开始时间',
            morning_end_time      STRING         comment '上午结束时间',
            afternoon_template_id int              comment '下午出勤模板id',
            afternoon_begin_time  STRING         comment '下午开始时间',
            afternoon_end_time    STRING         comment '下午结束时间',
            evening_template_id   int              comment '晚上出勤模板id',
            evening_begin_time    STRING         comment '晚上开始时间',
            evening_end_time      STRING         comment '晚上结束时间',
            use_begin_date        STRING         comment '使用开始日期',
            use_end_date          STRING         comment '使用结束日期',
            create_time           STRING       comment '创建时间',
            create_person         int              comment '创建人',
            remark                STRING      comment '备注')
        comment '班级作息时间表'
        PARTITIONED BY (dt STRING)
        ROW FORMAT DELIMITED 
        FIELDS TERMINATED BY '\t'
       stored as orc
        location '/user/hive/warehouse/itcast_dimen.db/class_time_dimen'
        TBLPROPERTIES ('orc.compress'='SNAPPY','orc.bloom.filter.columns'='id,class_id');
        sqoop import \
        --connect jdbc:mysql://node3:3306/teach \
        --username root \
        --password 123456 \
        --driver com.mysql.jdbc.Driver \
        --query 'select *, FROM_UNIXTIME(unix_timestamp(),"%Y-%m-%d") as dt from tbh_class_time_table where $CONDITIONS' \
        --hcatalog-database itcast_dimen \
      --hcatalog-table class_time_dimen \
        --hcatalog-storage-stanza 'stored as orc tblproperties ("orc.compress"="SNAPPY")' \
        -m 1

知识点10:数仓实现:DWM层出勤

  count(case morning_att when 0 or 1 then student_id else null end) as 上午出勤人数
  count(case morning_att when  1 then student_id else null end) as 上午迟到人数
   drop table itcast_dwm.class_attendance_dwm;
   CREATE TABLE IF NOT EXISTS itcast_dwm.class_attendance_dwm (
       dateinfo        String        comment '日期',
       class_id          int           comment '班级id',
       morning_att_count       String         comment '上午出勤人数',
       afternoon_att_count      String        comment '下午出勤人数',
       evening_att_count       String        comment '晚自习出勤人数',
       morning_late_count       String         comment '上午迟到人数',
       afternoon_late_count      String        comment '下午迟到人数',
       evening_late_count       String        comment '晚自习迟到人数')
   comment '学生出勤(正常出勤和迟到)数据'
   PARTITIONED BY (yearinfo STRING, monthinfo STRING, dayinfo STRING)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
   stored as orc
   location '/user/hive/warehouse/itcast_dwm.db/class_attendance_dwm'
   TBLPROPERTIES ('orc.compress'='SNAPPY');
   
   --内存不足,执行以下命令
   drop table itcast_dwm.class_attendance_dwm;
   CREATE TABLE IF NOT EXISTS itcast_dwm.class_attendance_dwm (
       dateinfo        String        comment '日期',
       class_id          int           comment '班级id',
       morning_att_count       String         comment '上午出勤人数',
       afternoon_att_count      String        comment '下午出勤人数',
       evening_att_count       String        comment '晚自习出勤人数',
       morning_late_count       String         comment '上午迟到人数',
       afternoon_late_count      String        comment '下午迟到人数',
     evening_late_count       String        comment '晚自习迟到人数')
   comment '学生出勤(正常出勤和迟到)数据'
 PARTITIONED BY (yearinfo STRING, monthinfo STRING, dayinfo STRING)
   ROW FORMAT DELIMITED
   FIELDS TERMINATED BY '\t'
   location '/user/hive/warehouse/itcast_dwm.db/class_attendance_dwm';
      --本地模式
      set hive.exec.mode.local.auto=true;
      --分区
      SET hive.exec.dynamic.partition=true;
      SET hive.exec.dynamic.partition.mode=nonstrict;
      set hive.exec.max.dynamic.partitions.pernode=10000;
      set hive.exec.max.dynamic.partitions=100000;
      set hive.exec.max.created.files=150000;
      --hive压缩
      set hive.exec.compress.intermediate=true;
      set hive.exec.compress.output=true;
      --写入时压缩生效
      set hive.exec.orc.compression.strategy=COMPRESSION;
      --分桶
      set hive.enforce.bucketing=true;
      set hive.enforce.sorting=true;
      set hive.optimize.bucketmapjoin = true;
      set hive.auto.convert.sortmerge.join=true;
      set hive.auto.convert.sortmerge.join.noconditionaltask=true;
      --并行执行
      set hive.exec.parallel=false;
      set hive.exec.parallel.thread.number=8;
      --矢量化查询
      set hive.vectorized.execution.enabled=true;
      --关联优化器
      set hive.optimize.correlation=true;
      --读取零拷贝
      set hive.exec.orc.zerocopy=true;
      --join数据倾斜
      set hive.optimize.skewjoin=false;
      -- set hive.skewjoin.key=100000;
      set hive.optimize.skewjoin.compiletime=false;
      -- group倾斜
      set hive.groupby.skewindata=false;
      --分析优化器
      ANALYZE TABLE itcast_dwm.student_attendance_dwm partition(yearinfo, monthinfo, dayinfo) COMPUTE STATISTICS;
    ANALYZE TABLE itcast_dwm.student_attendance_dwm partition(yearinfo, monthinfo, dayinfo) COMPUTE    STATISTICS FOR COLUMNS;
      set hive.cbo.enable=true;
    set hive.stats.autogather=true;
      set hive.compute.query.using.stats=true;
      set hive.stats.fetch.column.stats=true;
      set hive.stats.fetch.partition.stats=true;

知识点11:数仓实现:DWM层请假

知识点12:数仓实现:DWM层旷课

知识点13:数仓实现:DWS层

知识点14:数仓实现:APP层

知识点15:数仓实现:导出结果

知识点16:练习:有效线索主题

 comment '下午旷课率',
        evening_truant_count    float            comment '晚自习旷课人数',
       evening_truant_ratio    float        comment '晚自习旷课率',
       time_type            varchar(8)    COMMENT '聚合时间类型:1、按小时聚合;2、按天聚合;3、按周聚合;4、按月聚合;5、按年聚合。',
       yearinfo            varchar(8)    COMMENT '年',
       monthinfo            varchar(8)    COMMENT '月',
       dayinfo            varchar(8)    COMMENT '日'
    )
    comment '班级请假数据统计';

知识点16:练习:有效线索主题

标签:comment,count,String,学员,class,Day20,考勤,出勤,id
来源: https://blog.csdn.net/qq_45925467/article/details/116921486