hadoop学习---基于Hive的教育平台数据堆栈分析案例(二) ...

打印 上一主题 下一主题

主题 690|帖子 690|积分 2070

衔接第一部分,第一部分请点击:基于Hive的教育平台数据堆栈分析案例(一)
后接第三部分,第三部分请点击:基于Hive的教育平台数据堆栈分析案例   (三) 
意向用户模块(全量分析):

需求指标:

   需求一: 计期内,新增意向客户(包含本身录入的意向客户)总数。
    需求二: 统计指定时间段内,新增的意向客户,所在都会地域人数热力图。
  
  需求三: 统计指定时间段内,新增的意向客户中,意向学科人数排行榜。
  
  需求四: 统计指定时间段内,新增的意向客户中,意向校区人数排行榜。
  
  需求五: 统计指定时间段内,新增的意向客户中,差别来源渠道的意向客户占比。
  
  需求六: 统计指定时间段内,新增的意向客户中,各咨询中心产生的意向客户数占比情况。
      总体分析:  

   指标: 
            意向量
  维度: 
            固有维度:每个表都有的
                        时间维度: 年、 月 、 天、 小时
                        线上线下:
                        新老维度:
            产物属性维度: 
                        地域维度:
                        校区维度:
                        学科维度;
                        来源渠道:
                        各咨询中心:
  涉及表: 
            customer_relationship(客户意向表)  --------------(事实表)
            employee(员工表) -------------------------------------(维度表)
            scrm_department(部门表) -------------------------- (维度表)
            customer_clue(线索表) ------------------------------ (维度表)
            itcast_school(校区表) -------------------------------- (维度表)
            itcast_subject(学科表) ------------------------------- (维度表)
            customer (客户表)  ------------------------------------(维度表)
  表与表关系:  
            客户意向表.creator= 员工表.id
            员工表.tdepart_id = 部门表.id
            线索表.customer_relationship_id  = 客户意向表.id
            客户意向表.itcast_school_id  = 校区表.id
            客户意向表.itcast_subject_id  = 学科表.id
            客户意向表.customer_id  = 客户表.id
  涉及字段: 
            时间维度: 客户意向表.create_date_time
            线上线下: 客户意向表.origin_type --> origin_type_stat
            新老维度: 线索表.clue_state --> clue_state_stat
            地域维度: 客户表.area
            校区维度: 客户意向表.itcast_school_id 和 校区表.name
            学科维度: 客户意向表.itcast_subject_id 和 学科表.name
            来源渠道: 客户意向表.origin_type
            各咨询中心: 员工表.tdepart_id 和 部门表.name
            指标字段: 客户意向表.customer_id
            洗濯字段: 线索表.deleted 
    
需要洗濯的内容:
                  将删除标记为true的数据删除
                过滤出: 客户意向表.deleted = false
  需要转换的内容:
    1) 日期: 客户意向表.create_date_time  需要转换为: yearinfo  monthinfo dayinfo hourinfo
    2) 新老维度: 线索表.clue_state
        阐明: 当字段的值为 'VALID_NEW_CLUES' 为新用户
                    暂定: 其他的值都是老用户
        需要转换为一个新的字段: clue_state_stat 
            此字段只有二个值: 0(老)   1(新)
    3) 线上线下: 客户意向表.origin_type
        阐明: 当字段的值为 'NETSERVICE' 大概 'PRESIGNUP' 表示为线上
                暂定: 其他值都为线下
        需要转换为一个新的字段: origin_type_stat
            此字段只有二个值  0(线下)    1(线上)
    4) 校区和学科的id转换 
            需要将客户意向表中, 校区id 和 学科id 假如为 0大概 null 转换为 -1
  数据预备: 

将原始数据加载到当地MySQL数据库中 
创建数据库,实行sql文件: 点击下载:sql文件

  1. create database scrm default character set utf8mb4 collate utf8mb4_unicode_ci;
复制代码
建模分析: 

ODS层: 源数据层

   作用: 对接数据源, 一样寻常和数据源保持相同粒度 (直白: 将数据源中拷贝到ODS层中)
  处理方案:检察业务库有那些表,对照在oDs层构建有那些表,包管每个表字段保持划一,同时在ODs建表的时间需要额外添加一个特殊字段: starts_time(表示抽取数据的时间)
  放置事实表即可:
     customer_relationship(意向表 )  -- 本次主题的事实表
     customer_clue(线索表)  -- 本次主题的维度表, 下次主题的事实表

建表利用:   
    表中字段与数据源中字段保持划一, 只需要多加一个 抽取时间的字段即可
请注意:
    意向表  和 线索表中数据存在数据变更利用,需要接纳
迟钝渐变维(scd)的方式来解决
 
  DIM层: 维度层

   作用:存储维度表的数据
  放置维度表: 
    5张表
     customer(客户表)                  ---  维度表
     itcast_subject(学科表)            ---  维度表
     itcast_school(校区表)             ---  维度表
     employee(员工表)                  ---  维度表
     scrm_department(部门表)           ---  维度表
  建表:
   与数据源保持划一的字段即可, 多加一个当前抽取时间的字段
  DWD层: 明细层

DWD层表的构建: 必须字段(只能是事实表中字段) + 洗濯的字段 + 转换的字段+ join字段
   作用: 1) 洗濯转换处理工作
           2) 少量维度退化(此层不需要实行)
  需要洗濯内容: 
            将标记为删除的数据举行过滤掉 
  需要转换内容:
           1) 将create_date_time 转换为 yearinfo  monthinfo dayinfo hourinfo
           2) 将origin_type 转换为 origin_type_state (用于统计线上线下)
               转换逻辑: origin_type的值为: NETSERVICE 大概 PRESIGNUP 认为线上 别的认为线下
           3) 将clue_state 转换为 clue_state_stat (用于统计新老维度)
               转换逻辑:clue_state的值为 VALID_NEW_CLUES 为新客户  别的暂定为老客户
           4) 将校区和学科的 id字段, 假如为 0 大概 null 转换为 -1
  customer_relationship(意向表 )    ---  事实表
         时间维度: create_date_time
           线上线下: origin_type --> origin_type_stat
           来源渠道: origin_type
           校区维度:  itcast_school_id
           学科维度:  itcast_subject_id 
           指标字段: customer_id,
           关联条件的字段: creator,id
  表字段的组成:
   customer_id, create_date_time,origin_type,itcast_school_id,itcast_subject_id,creator,id
   deleted,origin_type_stat,yearinfo  monthinfo dayinfo hourinfo
  DWM层: 中间层 

   作用: 1) 提前聚合的利用( 由于有去重,导致无法实行) 2) 维度退化利用
  思考1:需要做什么维度退化利用?
          需要做,将所有维度表和事实表关联在一起,将维度表中需要的字段归并到事实表
思考2:需要做什么提前聚合利用?
            不需要,后期做,现在做可能导致数据缺失。
  建表字段WD层+各个表维度字段
  customer_id,create_date_time, yearinfo  monthinfo dayinfo hourinfo deleted (意义不大)
clue_state_stat(此字段需要转换),origin_type_stat,area,itcast_subject_id,itcast_subject_name
itcast_school_id,itcast_school_name,origin_type,tdepart_id,tdepart_name
  注意:要聚合上面所有字段要举行七表关联的利用。
  DWS层: 业务层

作用: 细化统计各个维度的数据
   DWS层表字段构成:  统计的字段 + 各个维度的字段 + 三个用于查询的字段
  维度: 
    固有维度:
                时间维度: 年  月  天 小时
                新老维度:
                线上线下
    产物属性维度:
                总意向量
                地域(地域)维度
                学科维度
                校区维度
                来源渠道
                各咨询中心
  DWS层表字段:
   customerid_total, yearinfo,monthinfo,dayinfo,hourinfo,clue_state_stat,origin_type_stat,
   area,itcast_subject_id,itcast_subject_name, itcast_school_id,itcast_school_name,
   origin_type, tdepart_id,tdepart_name,group_type,time_type,time_str 
  DA层:


   作用: 对策应用, 应用需要什么数据, 从DWS层获取什么数据即可
  此层现在不做任何处理, 已经全部需要都细化统计完成了, 后续详细用什么, 看图表支持了...
  建模利用(建表):

ODS层:将MySQL数据库中数据导入hive中

  1. set hive.exec.orc.compression.strategy=COMPRESSION;
复制代码
客户意向表:(内部 分区 分桶表, 拉链表)
  1. CREATE TABLE IF NOT EXISTS itcast_ods.`customer_relationship` (
  2.   `id` int COMMENT '客户关系id',
  3.   `create_date_time` STRING COMMENT '创建时间',
  4.   `update_date_time` STRING COMMENT '最后更新时间',
  5.   `deleted` int COMMENT '是否被删除(禁用)',
  6.   `customer_id` int COMMENT '所属客户id',
  7.   `first_id` int COMMENT '第一条客户关系id',
  8.   `belonger` int COMMENT '归属人',
  9.   `belonger_name` STRING COMMENT '归属人姓名',
  10.   `initial_belonger` int COMMENT '初始归属人',
  11.   `distribution_handler` int COMMENT '分配处理人',
  12.   `business_scrm_department_id` int COMMENT '归属部门',
  13.   `last_visit_time` STRING COMMENT '最后回访时间',
  14.   `next_visit_time` STRING COMMENT '下次回访时间',
  15.   `origin_type` STRING COMMENT '数据来源',
  16.   `itcast_school_id` int COMMENT '校区Id',
  17.   `itcast_subject_id` int COMMENT '学科Id',
  18.   `intention_study_type` STRING COMMENT '意向学习方式',
  19.   `anticipat_signup_date` STRING COMMENT '预计报名时间',
  20.   `level` STRING COMMENT '客户级别',
  21.   `creator` int COMMENT '创建人',
  22.   `current_creator` int COMMENT '当前创建人:初始==创建人,当在公海拉回时为 拉回人',
  23.   `creator_name` STRING COMMENT '创建者姓名',
  24.   `origin_channel` STRING COMMENT '来源渠道',
  25.   `comment` STRING COMMENT '备注',
  26.   `first_customer_clue_id` int COMMENT '第一条线索id',
  27.   `last_customer_clue_id` int COMMENT '最后一条线索id',
  28.   `process_state` STRING COMMENT '处理状态',
  29.   `process_time` STRING COMMENT '处理状态变动时间',
  30.   `payment_state` STRING COMMENT '支付状态',
  31.   `payment_time` STRING COMMENT '支付状态变动时间',
  32.   `signup_state` STRING COMMENT '报名状态',
  33.   `signup_time` STRING COMMENT '报名时间',
  34.   `notice_state` STRING COMMENT '通知状态',
  35.   `notice_time` STRING COMMENT '通知状态变动时间',
  36.   `lock_state` STRING COMMENT '锁定状态',
  37.   `lock_time` STRING COMMENT '锁定状态修改时间',
  38.   `itcast_clazz_id` int COMMENT '所属ems班级id',
  39.   `itcast_clazz_time` STRING COMMENT '报班时间',
  40.   `payment_url` STRING COMMENT '付款链接',
  41.   `payment_url_time` STRING COMMENT '支付链接生成时间',
  42.   `ems_student_id` int COMMENT 'ems的学生id',
  43.   `delete_reason` STRING COMMENT '删除原因',
  44.   `deleter` int COMMENT '删除人',
  45.   `deleter_name` STRING COMMENT '删除人姓名',
  46.   `delete_time` STRING COMMENT '删除时间',
  47.   `course_id` int COMMENT '课程ID',
  48.   `course_name` STRING COMMENT '课程名称',
  49.   `delete_comment` STRING COMMENT '删除原因说明',
  50.   `close_state` STRING COMMENT '关闭装填',
  51.   `close_time` STRING COMMENT '关闭状态变动时间',
  52.   `appeal_id` int COMMENT '申诉id',
  53.   `tenant` int COMMENT '租户',
  54.   `total_fee` DECIMAL COMMENT '报名费总金额',
  55.   `belonged` int COMMENT '小周期归属人',
  56.   `belonged_time` STRING COMMENT '归属时间',
  57.   `belonger_time` STRING COMMENT '归属时间',
  58.   `transfer` int COMMENT '转移人',
  59.   `transfer_time` STRING COMMENT '转移时间',
  60.   `follow_type` int COMMENT '分配类型,0-自动分配,1-手动分配,2-自动转移,3-手动单个转移,4-手动批量转移,5-公海领取',
  61.   `transfer_bxg_oa_account` STRING COMMENT '转移到博学谷归属人OA账号',
  62.   `transfer_bxg_belonger_name` STRING COMMENT '转移到博学谷归属人OA姓名',
  63.   `end_time` STRING COMMENT '有效截止时间')
  64. comment '客户关系表'
  65. PARTITIONED BY(start_time STRING)
  66. clustered by(id) sorted by(id) into 10 buckets
  67. ROW FORMAT DELIMITED
  68. FIELDS TERMINATED BY '\t'
  69. stored as orc
  70. TBLPROPERTIES ('orc.compress'='ZLIB');
复制代码
客户线索表:(内部分区分桶表, 拉链表)
  1. CREATE TABLE IF NOT EXISTS itcast_ods.customer_clue (
  2.   id int COMMENT 'customer_clue_id',
  3.   create_date_time STRING COMMENT '创建时间',
  4.   update_date_time STRING COMMENT '最后更新时间',
  5.   deleted STRING COMMENT '是否被删除(禁用)',
  6.   customer_id int COMMENT '客户id',
  7.   customer_relationship_id int COMMENT '客户关系id',
  8.   session_id STRING COMMENT '七陌会话id',
  9.   sid STRING COMMENT '访客id',
  10.   status STRING COMMENT '状态(undeal待领取 deal 已领取 finish 已关闭 changePeer 已流转)',
  11.   users STRING COMMENT '所属坐席',
  12.   create_time STRING COMMENT '七陌创建时间',
  13.   platform STRING COMMENT '平台来源 (pc-网站咨询|wap-wap咨询|sdk-app咨询|weixin-微信咨询)',
  14.   s_name STRING COMMENT '用户名称',
  15.   seo_source STRING COMMENT '搜索来源',
  16.   seo_keywords STRING COMMENT '关键字',
  17.   ip STRING COMMENT 'IP地址',
  18.   referrer STRING COMMENT '上级来源页面',
  19.   from_url STRING COMMENT '会话来源页面',
  20.   landing_page_url STRING COMMENT '访客着陆页面',
  21.   url_title STRING COMMENT '咨询页面title',
  22.   to_peer STRING COMMENT '所属技能组',
  23.   manual_time STRING COMMENT '人工开始时间',
  24.   begin_time STRING COMMENT '坐席领取时间 ',
  25.   reply_msg_count int COMMENT '客服回复消息数',
  26.   total_msg_count int COMMENT '消息总数',
  27.   msg_count int COMMENT '客户发送消息数',
  28.   comment STRING COMMENT '备注',
  29.   finish_reason STRING COMMENT '结束类型',
  30.   finish_user STRING COMMENT '结束坐席',
  31.   end_time STRING COMMENT '会话结束时间',
  32.   platform_description STRING COMMENT '客户平台信息',
  33.   browser_name STRING COMMENT '浏览器名称',
  34.   os_info STRING COMMENT '系统名称',
  35.   area STRING COMMENT '区域',
  36.   country STRING COMMENT '所在国家',
  37.   province STRING COMMENT '省',
  38.   city STRING COMMENT '城市',
  39.   creator int COMMENT '创建人',
  40.   name STRING COMMENT '客户姓名',
  41.   idcard STRING COMMENT '身份证号',
  42.   phone STRING COMMENT '手机号',
  43.   itcast_school_id int COMMENT '校区Id',
  44.   itcast_school STRING COMMENT '校区',
  45.   itcast_subject_id int COMMENT '学科Id',
  46.   itcast_subject STRING COMMENT '学科',
  47.   wechat STRING COMMENT '微信',
  48.   qq STRING COMMENT 'qq号',
  49.   email STRING COMMENT '邮箱',
  50.   gender STRING COMMENT '性别',
  51.   level STRING COMMENT '客户级别',
  52.   origin_type STRING COMMENT '数据来源渠道',
  53.   information_way STRING COMMENT '资讯方式',
  54.   working_years STRING COMMENT '开始工作时间',
  55.   technical_directions STRING COMMENT '技术方向',
  56.   customer_state STRING COMMENT '当前客户状态',
  57.   valid STRING COMMENT '该线索是否是网资有效线索',
  58.   anticipat_signup_date STRING COMMENT '预计报名时间',
  59.   clue_state STRING COMMENT '线索状态',
  60.   scrm_department_id int COMMENT 'SCRM内部部门id',
  61.   superior_url STRING COMMENT '诸葛获取上级页面URL',
  62.   superior_source STRING COMMENT '诸葛获取上级页面URL标题',
  63.   landing_url STRING COMMENT '诸葛获取着陆页面URL',
  64.   landing_source STRING COMMENT '诸葛获取着陆页面URL来源',
  65.   info_url STRING COMMENT '诸葛获取留咨页URL',
  66.   info_source STRING COMMENT '诸葛获取留咨页URL标题',
  67.   origin_channel STRING COMMENT '投放渠道',
  68.   course_id int COMMENT '课程编号',
  69.   course_name STRING COMMENT '课程名称',
  70.   zhuge_session_id STRING COMMENT 'zhuge会话id',
  71.   is_repeat int COMMENT '是否重复线索(手机号维度) 0:正常 1:重复',
  72.   tenant int COMMENT '租户id',
  73.   activity_id STRING COMMENT '活动id',
  74.   activity_name STRING COMMENT '活动名称',
  75.   follow_type int COMMENT '分配类型,0-自动分配,1-手动分配,2-自动转移,3-手动单个转移,4-手动批量转移,5-公海领取',
  76.   shunt_mode_id int COMMENT '匹配到的技能组id',
  77.   shunt_employee_group_id int COMMENT '所属分流员工组',
  78.   ends_time STRING COMMENT '有效时间')
  79. comment '客户关系表'
  80. PARTITIONED BY(starts_time STRING)
  81. clustered by(customer_relationship_id) sorted by(customer_relationship_id) into 10 buckets
  82. ROW FORMAT DELIMITED
  83. FIELDS TERMINATED BY '\t'
  84. stored as orc
  85. TBLPROPERTIES ('orc.compress'='ZLIB');
复制代码
DIM层:

五张维度表:客户表,学科表,校区表,员工表,部门表:
  1. CREATE DATABASE IF NOT EXISTS itcast_dimen;
  2. -- 客户表
  3. CREATE TABLE IF NOT EXISTS itcast_dimen.`customer` (
  4.   `id` int COMMENT 'key id',
  5.   `customer_relationship_id` int COMMENT '当前意向id',
  6.   `create_date_time` STRING COMMENT '创建时间',
  7.   `update_date_time` STRING COMMENT '最后更新时间',
  8.   `deleted` int  COMMENT '是否被删除(禁用)',
  9.   `name` STRING COMMENT '姓名',
  10.   `idcard` STRING  COMMENT '身份证号',
  11.   `birth_year` int COMMENT '出生年份',
  12.   `gender` STRING COMMENT '性别',
  13.   `phone` STRING COMMENT '手机号',
  14.   `wechat` STRING COMMENT '微信',
  15.   `qq` STRING COMMENT 'qq号',
  16.   `email` STRING COMMENT '邮箱',
  17.   `area` STRING COMMENT '所在区域',
  18.   `leave_school_date` date COMMENT '离校时间',
  19.   `graduation_date` date COMMENT '毕业时间',
  20.   `bxg_student_id` STRING COMMENT '博学谷学员ID,可能未关联到,不存在',
  21.   `creator` int COMMENT '创建人ID',
  22.   `origin_type` STRING COMMENT '数据来源',
  23.   `origin_channel` STRING COMMENT '来源渠道',
  24.   `tenant` int,
  25.   `md_id` int COMMENT '中台id')
  26. comment '客户表'
  27. PARTITIONED BY(start_time STRING)
  28. ROW FORMAT DELIMITED
  29. FIELDS TERMINATED BY '\t'
  30. stored as orc
  31. TBLPROPERTIES ('orc.compress'='SNAPPY');
  32. -- 学科表
  33. CREATE TABLE IF NOT EXISTS itcast_dimen.`itcast_subject` (
  34.   `id` int COMMENT '自增主键',
  35.   `create_date_time` timestamp COMMENT '创建时间',
  36.   `update_date_time` timestamp COMMENT '最后更新时间',
  37.   `deleted` STRING COMMENT '是否被删除(禁用)',
  38.   `name` STRING COMMENT '学科名称',
  39.   `code` STRING COMMENT '学科编码',
  40.   `tenant` int COMMENT '租户')
  41. comment '学科字典表'
  42. PARTITIONED BY(start_time STRING)
  43. ROW FORMAT DELIMITED
  44. FIELDS TERMINATED BY '\t'
  45. stored as orc
  46. TBLPROPERTIES ('orc.compress'='SNAPPY');
  47. -- 校区表
  48. CREATE TABLE IF NOT EXISTS itcast_dimen.`itcast_school` (
  49.   `id` int COMMENT '自增主键',
  50.   `create_date_time` timestamp COMMENT '创建时间',
  51.   `update_date_time` timestamp  COMMENT '最后更新时间',
  52.   `deleted` STRING COMMENT '是否被删除(禁用)',
  53.   `name` STRING COMMENT '校区名称',
  54.   `code` STRING COMMENT '校区标识',
  55.   `tenant` int COMMENT '租户')
  56. comment '校区字典表'
  57. PARTITIONED BY(start_time STRING)
  58. ROW FORMAT DELIMITED
  59. FIELDS TERMINATED BY '\t'
  60. stored as orc
  61. TBLPROPERTIES ('orc.compress'='SNAPPY');
  62. -- 员工表
  63. CREATE TABLE IF NOT EXISTS itcast_dimen.employee (
  64.   id int COMMENT '员工id',
  65.   email STRING COMMENT '公司邮箱,OA登录账号',
  66.   real_name STRING COMMENT '员工的真实姓名',
  67.   phone STRING COMMENT '手机号,目前还没有使用;隐私问题OA接口没有提供这个属性,',
  68.   department_id STRING COMMENT 'OA中的部门编号,有负值',
  69.   department_name STRING COMMENT 'OA中的部门名',
  70.   remote_login STRING COMMENT '员工是否可以远程登录',
  71.   job_number STRING COMMENT '员工工号',
  72.   cross_school STRING COMMENT '是否有跨校区权限',
  73.   last_login_date STRING COMMENT '最后登录日期',
  74.   creator int COMMENT '创建人',
  75.   create_date_time STRING COMMENT '创建时间',
  76.   update_date_time STRING COMMENT '最后更新时间',
  77.   deleted STRING COMMENT '是否被删除(禁用)',
  78.   scrm_department_id int COMMENT 'SCRM内部部门id',
  79.   leave_office STRING COMMENT '离职状态',
  80.   leave_office_time STRING COMMENT '离职时间',
  81.   reinstated_time STRING COMMENT '复职时间',
  82.   superior_leaders_id int COMMENT '上级领导ID',
  83.   tdepart_id int COMMENT '直属部门',
  84.   tenant int COMMENT '租户',
  85.   ems_user_name STRING COMMENT 'ems用户名称'
  86. )
  87. comment '员工表'
  88. PARTITIONED BY(start_time STRING)
  89. ROW FORMAT DELIMITED
  90. FIELDS TERMINATED BY '\t'
  91. stored as orc
  92. TBLPROPERTIES ('orc.compress'='SNAPPY');
  93. -- 部门表
  94. CREATE TABLE IF NOT EXISTS itcast_dimen.`scrm_department` (
  95.   `id` int COMMENT '部门id',
  96.   `name` STRING COMMENT '部门名称',
  97.   `parent_id` int COMMENT '父部门id',
  98.   `create_date_time` STRING COMMENT '创建时间',
  99.   `update_date_time` STRING COMMENT '更新时间',
  100.   `deleted` STRING COMMENT '删除标志',
  101.   `id_path` STRING COMMENT '编码全路径',
  102.   `tdepart_code` int COMMENT '直属部门',
  103.   `creator` STRING COMMENT '创建者',
  104.   `depart_level` int COMMENT '部门层级',
  105.   `depart_sign` int COMMENT '部门标志,暂时默认1',
  106.   `depart_line` int COMMENT '业务线,存储业务线编码',
  107.   `depart_sort` int COMMENT '排序字段',
  108.   `disable_flag` int COMMENT '禁用标志',
  109.   `tenant` int COMMENT '租户')
  110. comment 'scrm部门表'
  111. PARTITIONED BY(start_time STRING)
  112. ROW FORMAT DELIMITED
  113. FIELDS TERMINATED BY '\t'
  114. stored as orc
  115. TBLPROPERTIES ('orc.compress'='SNAPPY');CREATE DATABASE IF NOT EXISTS itcast_dimen;
  116. -- 客户表
  117. CREATE TABLE IF NOT EXISTS itcast_dimen.`customer` (
  118.   `id` int COMMENT 'key id',
  119.   `customer_relationship_id` int COMMENT '当前意向id',
  120.   `create_date_time` STRING COMMENT '创建时间',
  121.   `update_date_time` STRING COMMENT '最后更新时间',
  122.   `deleted` int  COMMENT '是否被删除(禁用)',
  123.   `name` STRING COMMENT '姓名',
  124.   `idcard` STRING  COMMENT '身份证号',
  125.   `birth_year` int COMMENT '出生年份',
  126.   `gender` STRING COMMENT '性别',
  127.   `phone` STRING COMMENT '手机号',
  128.   `wechat` STRING COMMENT '微信',
  129.   `qq` STRING COMMENT 'qq号',
  130.   `email` STRING COMMENT '邮箱',
  131.   `area` STRING COMMENT '所在区域',
  132.   `leave_school_date` date COMMENT '离校时间',
  133.   `graduation_date` date COMMENT '毕业时间',
  134.   `bxg_student_id` STRING COMMENT '博学谷学员ID,可能未关联到,不存在',
  135.   `creator` int COMMENT '创建人ID',
  136.   `origin_type` STRING COMMENT '数据来源',
  137.   `origin_channel` STRING COMMENT '来源渠道',
  138.   `tenant` int,
  139.   `md_id` int COMMENT '中台id')
  140. comment '客户表'
  141. PARTITIONED BY(start_time STRING)
  142. ROW FORMAT DELIMITED
  143. FIELDS TERMINATED BY '\t'
  144. stored as orc
  145. TBLPROPERTIES ('orc.compress'='SNAPPY');
  146. -- 学科表
  147. CREATE TABLE IF NOT EXISTS itcast_dimen.`itcast_subject` (
  148.   `id` int COMMENT '自增主键',
  149.   `create_date_time` timestamp COMMENT '创建时间',
  150.   `update_date_time` timestamp COMMENT '最后更新时间',
  151.   `deleted` STRING COMMENT '是否被删除(禁用)',
  152.   `name` STRING COMMENT '学科名称',
  153.   `code` STRING COMMENT '学科编码',
  154.   `tenant` int COMMENT '租户')
  155. comment '学科字典表'
  156. PARTITIONED BY(start_time STRING)
  157. ROW FORMAT DELIMITED
  158. FIELDS TERMINATED BY '\t'
  159. stored as orc
  160. TBLPROPERTIES ('orc.compress'='SNAPPY');
  161. -- 校区表
  162. CREATE TABLE IF NOT EXISTS itcast_dimen.`itcast_school` (
  163.   `id` int COMMENT '自增主键',
  164.   `create_date_time` timestamp COMMENT '创建时间',
  165.   `update_date_time` timestamp  COMMENT '最后更新时间',
  166.   `deleted` STRING COMMENT '是否被删除(禁用)',
  167.   `name` STRING COMMENT '校区名称',
  168.   `code` STRING COMMENT '校区标识',
  169.   `tenant` int COMMENT '租户')
  170. comment '校区字典表'
  171. PARTITIONED BY(start_time STRING)
  172. ROW FORMAT DELIMITED
  173. FIELDS TERMINATED BY '\t'
  174. stored as orc
  175. TBLPROPERTIES ('orc.compress'='SNAPPY');
  176. -- 员工表
  177. CREATE TABLE IF NOT EXISTS itcast_dimen.employee (
  178.   id int COMMENT '员工id',
  179.   email STRING COMMENT '公司邮箱,OA登录账号',
  180.   real_name STRING COMMENT '员工的真实姓名',
  181.   phone STRING COMMENT '手机号,目前还没有使用;隐私问题OA接口没有提供这个属性,',
  182.   department_id STRING COMMENT 'OA中的部门编号,有负值',
  183.   department_name STRING COMMENT 'OA中的部门名',
  184.   remote_login STRING COMMENT '员工是否可以远程登录',
  185.   job_number STRING COMMENT '员工工号',
  186.   cross_school STRING COMMENT '是否有跨校区权限',
  187.   last_login_date STRING COMMENT '最后登录日期',
  188.   creator int COMMENT '创建人',
  189.   create_date_time STRING COMMENT '创建时间',
  190.   update_date_time STRING COMMENT '最后更新时间',
  191.   deleted STRING COMMENT '是否被删除(禁用)',
  192.   scrm_department_id int COMMENT 'SCRM内部部门id',
  193.   leave_office STRING COMMENT '离职状态',
  194.   leave_office_time STRING COMMENT '离职时间',
  195.   reinstated_time STRING COMMENT '复职时间',
  196.   superior_leaders_id int COMMENT '上级领导ID',
  197.   tdepart_id int COMMENT '直属部门',
  198.   tenant int COMMENT '租户',
  199.   ems_user_name STRING COMMENT 'ems用户名称'
  200. )
  201. comment '员工表'
  202. PARTITIONED BY(start_time STRING)
  203. ROW FORMAT DELIMITED
  204. FIELDS TERMINATED BY '\t'
  205. stored as orc
  206. TBLPROPERTIES ('orc.compress'='SNAPPY');
  207. -- 部门表
  208. CREATE TABLE IF NOT EXISTS itcast_dimen.`scrm_department` (
  209.   `id` int COMMENT '部门id',
  210.   `name` STRING COMMENT '部门名称',
  211.   `parent_id` int COMMENT '父部门id',
  212.   `create_date_time` STRING COMMENT '创建时间',
  213.   `update_date_time` STRING COMMENT '更新时间',
  214.   `deleted` STRING COMMENT '删除标志',
  215.   `id_path` STRING COMMENT '编码全路径',
  216.   `tdepart_code` int COMMENT '直属部门',
  217.   `creator` STRING COMMENT '创建者',
  218.   `depart_level` int COMMENT '部门层级',
  219.   `depart_sign` int COMMENT '部门标志,暂时默认1',
  220.   `depart_line` int COMMENT '业务线,存储业务线编码',
  221.   `depart_sort` int COMMENT '排序字段',
  222.   `disable_flag` int COMMENT '禁用标志',
  223.   `tenant` int COMMENT '租户')
  224. comment 'scrm部门表'
  225. PARTITIONED BY(start_time STRING)
  226. ROW FORMAT DELIMITED
  227. FIELDS TERMINATED BY '\t'
  228. stored as orc
  229. TBLPROPERTIES ('orc.compress'='SNAPPY');
复制代码
DWD层:

  1. CREATE TABLE IF NOT EXISTS itcast_dwd.`itcast_intention_dwd` (
  2.   `rid` int COMMENT 'id',
  3.   `customer_id` STRING COMMENT '客户id',
  4.   `create_date_time` STRING COMMENT '创建时间',
  5.   `itcast_school_id` STRING COMMENT '校区id',
  6.   `deleted` STRING COMMENT '是否被删除',
  7.   `origin_type` STRING COMMENT '来源渠道',
  8.   `itcast_subject_id` STRING COMMENT '学科id',
  9.   `creator` int COMMENT '创建人',
  10.   `hourinfo` STRING COMMENT '小时信息',
  11.   `origin_type_stat` STRING COMMENT '数据来源:0.线下;1.线上'
  12. )
  13. comment '客户意向dwd表'
  14. PARTITIONED BY(yearinfo STRING,monthinfo STRING,dayinfo STRING)
  15. clustered by(rid) sorted by(rid) into 10 buckets
  16. ROW FORMAT DELIMITED
  17. FIELDS TERMINATED BY '\t'
  18. stored as ORC
  19. TBLPROPERTIES ('orc.compress'='SNAPPY');
复制代码
DWM层:

  1. create database itcast_dwm;
  2. CREATE TABLE IF NOT EXISTS itcast_dwm.`itcast_intention_dwm` (
  3.   `customer_id` STRING COMMENT 'id信息',
  4.   `create_date_time` STRING COMMENT '创建时间',
  5.   `area` STRING COMMENT '区域信息',
  6.   `itcast_school_id` STRING COMMENT '校区id',
  7.   `itcast_school_name` STRING COMMENT '校区名称',
  8.   `deleted` STRING COMMENT '是否被删除',
  9.   `origin_type` STRING COMMENT '来源渠道',
  10.   `itcast_subject_id` STRING COMMENT '学科id',
  11.   `itcast_subject_name` STRING COMMENT '学科名称',
  12.   `hourinfo` STRING COMMENT '小时信息',
  13.   `origin_type_stat` STRING COMMENT '数据来源:0.线下;1.线上',
  14.   `clue_state_stat` STRING COMMENT '新老客户:0.老客户;1.新客户',
  15.   `tdepart_id` STRING COMMENT '创建者部门id',
  16.   `tdepart_name` STRING COMMENT '咨询中心名称'
  17. )
  18. comment '客户意向dwm表'
  19. PARTITIONED BY(yearinfo STRING,monthinfo STRING,dayinfo STRING)
  20. clustered by(customer_id) sorted by(customer_id) into 10 buckets
  21. ROW FORMAT DELIMITED
  22. FIELDS TERMINATED BY '\t'
  23. stored as ORC
  24. TBLPROPERTIES ('orc.compress'='SNAPPY');
复制代码
DWS层

  1. CREATE TABLE IF NOT EXISTS itcast_dws.itcast_intention_dws (
  2.    `customer_total` INT COMMENT '聚合意向客户数',
  3.    `area` STRING COMMENT '区域信息',
  4.    `itcast_school_id` STRING COMMENT '校区id',
  5.    `itcast_school_name` STRING COMMENT '校区名称',
  6.    `origin_type` STRING COMMENT '来源渠道',
  7.    `itcast_subject_id` STRING COMMENT '学科id',
  8.    `itcast_subject_name` STRING COMMENT '学科名称',
  9.    `hourinfo` STRING COMMENT '小时信息',
  10.    `origin_type_stat` STRING COMMENT '数据来源:0.线下;1.线上',
  11.    `clue_state_stat` STRING COMMENT '客户属性:0.老客户;1.新客户',
  12.    `tdepart_id` STRING COMMENT '创建者部门id',
  13.    `tdepart_name` STRING COMMENT '咨询中心名称',
  14.    `time_str` STRING COMMENT '时间明细',
  15.    `groupType` STRING COMMENT '产品属性类别:1.总意向量;2.区域信息;3.校区、学科组合分组;4.来源渠道;5.咨询中心;',
  16.    `time_type` STRING COMMENT '时间维度:1、按小时聚合;2、按天聚合;3、按周聚合;4、按月聚合;5、按年聚合;'
  17. )
  18. comment '客户意向dws表'
  19. PARTITIONED BY(yearinfo STRING,monthinfo STRING,dayinfo STRING)
  20. ROW FORMAT DELIMITED
  21. FIELDS TERMINATED BY '\t'
  22. stored as orc
  23. TBLPROPERTIES ('orc.compress'='SNAPPY');
复制代码
数据采集:

目的: 用sqoop将业务端(MySQL)的数据导入到ODS层对应表(hive)中。
注意:字段名字要逐一对应,不对的要改名再导入。
DIM层(维度表):

  1. # 客户表
  2. sqoop import \
  3. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  4. --username root \
  5. --password 123456 \
  6. --query 'SELECT
  7.   *, "2021-09-27" AS start_time
  8. FROM customer where 1=1 and $CONDITIONS' \
  9. --hcatalog-database itcast_dimen \
  10. --hcatalog-table customer \
  11. -m 1
  12. # 学科表:
  13. sqoop import \
  14. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  15. --username root \
  16. --password 123456 \
  17. --query 'SELECT
  18.   *, "2021-09-27" AS start_time
  19. FROM itcast_subject where 1=1 and $CONDITIONS' \
  20. --hcatalog-database itcast_dimen \
  21. --hcatalog-table itcast_subject \
  22. -m 1
  23. # 校区表:
  24. sqoop import \
  25. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  26. --username root \
  27. --password 123456 \
  28. --query 'SELECT
  29.   *, "2021-09-27" AS start_time
  30. FROM itcast_school where 1=1 and $CONDITIONS' \
  31. --hcatalog-database itcast_dimen \
  32. --hcatalog-table itcast_school \
  33. -m 1
  34. # 员工表
  35. sqoop import \
  36. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  37. --username root \
  38. --password 123456 \
  39. --query 'SELECT
  40.   *, "2021-09-27" AS start_time
  41. FROM employee where 1=1 and $CONDITIONS' \
  42. --hcatalog-database itcast_dimen \
  43. --hcatalog-table employee \
  44. -m 1
  45. # 部门表
  46. sqoop import \
  47. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  48. --username root \
  49. --password 123456 \
  50. --query 'SELECT
  51.   *, "2021-09-27" AS start_time
  52. FROM scrm_department where 1=1 and $CONDITIONS' \
  53. --hcatalog-database itcast_dimen \
  54. --hcatalog-table scrm_department \
  55. -m 1
复制代码

ODS层:  (分桶表需要构建暂时表)

-- 客户意向表

-- 第一步: 创建一张客户意向表的暂时表
  1. CREATE TABLE IF NOT EXISTS itcast_ods.`customer_relationship_temp` (
  2.   `id` int COMMENT '客户关系id',
  3.   `create_date_time` STRING COMMENT '创建时间',
  4.   `update_date_time` STRING COMMENT '最后更新时间',
  5.   `deleted` int COMMENT '是否被删除(禁用)',
  6.   `customer_id` int COMMENT '所属客户id',
  7.   `first_id` int COMMENT '第一条客户关系id',
  8.   `belonger` int COMMENT '归属人',
  9.   `belonger_name` STRING COMMENT '归属人姓名',
  10.   `initial_belonger` int COMMENT '初始归属人',
  11.   `distribution_handler` int COMMENT '分配处理人',
  12.   `business_scrm_department_id` int COMMENT '归属部门',
  13.   `last_visit_time` STRING COMMENT '最后回访时间',
  14.   `next_visit_time` STRING COMMENT '下次回访时间',
  15.   `origin_type` STRING COMMENT '数据来源',
  16.   `itcast_school_id` int COMMENT '校区Id',
  17.   `itcast_subject_id` int COMMENT '学科Id',
  18.   `intention_study_type` STRING COMMENT '意向学习方式',
  19.   `anticipat_signup_date` STRING COMMENT '预计报名时间',
  20.   `level` STRING COMMENT '客户级别',
  21.   `creator` int COMMENT '创建人',
  22.   `current_creator` int COMMENT '当前创建人:初始==创建人,当在公海拉回时为 拉回人',
  23.   `creator_name` STRING COMMENT '创建者姓名',
  24.   `origin_channel` STRING COMMENT '来源渠道',
  25.   `comment` STRING COMMENT '备注',
  26.   `first_customer_clue_id` int COMMENT '第一条线索id',
  27.   `last_customer_clue_id` int COMMENT '最后一条线索id',
  28.   `process_state` STRING COMMENT '处理状态',
  29.   `process_time` STRING COMMENT '处理状态变动时间',
  30.   `payment_state` STRING COMMENT '支付状态',
  31.   `payment_time` STRING COMMENT '支付状态变动时间',
  32.   `signup_state` STRING COMMENT '报名状态',
  33.   `signup_time` STRING COMMENT '报名时间',
  34.   `notice_state` STRING COMMENT '通知状态',
  35.   `notice_time` STRING COMMENT '通知状态变动时间',
  36.   `lock_state` STRING COMMENT '锁定状态',
  37.   `lock_time` STRING COMMENT '锁定状态修改时间',
  38.   `itcast_clazz_id` int COMMENT '所属ems班级id',
  39.   `itcast_clazz_time` STRING COMMENT '报班时间',
  40.   `payment_url` STRING COMMENT '付款链接',
  41.   `payment_url_time` STRING COMMENT '支付链接生成时间',
  42.   `ems_student_id` int COMMENT 'ems的学生id',
  43.   `delete_reason` STRING COMMENT '删除原因',
  44.   `deleter` int COMMENT '删除人',
  45.   `deleter_name` STRING COMMENT '删除人姓名',
  46.   `delete_time` STRING COMMENT '删除时间',
  47.   `course_id` int COMMENT '课程ID',
  48.   `course_name` STRING COMMENT '课程名称',
  49.   `delete_comment` STRING COMMENT '删除原因说明',
  50.   `close_state` STRING COMMENT '关闭装填',
  51.   `close_time` STRING COMMENT '关闭状态变动时间',
  52.   `appeal_id` int COMMENT '申诉id',
  53.   `tenant` int COMMENT '租户',
  54.   `total_fee` DECIMAL COMMENT '报名费总金额',
  55.   `belonged` int COMMENT '小周期归属人',
  56.   `belonged_time` STRING COMMENT '归属时间',
  57.   `belonger_time` STRING COMMENT '归属时间',
  58.   `transfer` int COMMENT '转移人',
  59.   `transfer_time` STRING COMMENT '转移时间',
  60.   `follow_type` int COMMENT '分配类型,0-自动分配,1-手动分配,2-自动转移,3-手动单个转移,4-手动批量转移,5-公海领取',
  61.   `transfer_bxg_oa_account` STRING COMMENT '转移到博学谷归属人OA账号',
  62.   `transfer_bxg_belonger_name` STRING COMMENT '转移到博学谷归属人OA姓名',
  63.   `end_time` STRING COMMENT '有效截止时间')
  64. comment '客户关系表'
  65. PARTITIONED BY(start_time STRING)
  66. ROW FORMAT DELIMITED
  67. FIELDS TERMINATED BY '\t'
  68. stored as orc
  69. TBLPROPERTIES ('orc.compress'='ZLIB');
复制代码
-- 第二步: 编写sqoop命令 将数据导入到暂时表 
  1. sqoop import \
  2. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  3. --username root \
  4. --password 123456 \
  5. --query 'SELECT
  6.   *, "9999-12-31" as end_time , "2021-09-27" AS start_time
  7. FROM customer_relationship where 1=1 and $CONDITIONS' \
  8. --hcatalog-database itcast_ods \
  9. --hcatalog-table customer_relationship_temp \
  10. -m 1
复制代码
-- 第三步: 实行 insert into + select 导入到目的表
  1. -- 动态分区配置
  2. set hive.exec.dynamic.partition=true;
  3. set hive.exec.dynamic.partition.mode=nonstrict;
  4. -- hive压缩
  5. set hive.exec.compress.intermediate=true;
  6. set hive.exec.compress.output=true;
  7. -- 写入时压缩生效
  8. set hive.exec.orc.compression.strategy=COMPRESSION;
  9. insert into table itcast_ods.customer_relationship partition(start_time)
  10. select * from itcast_ods.customer_relationship_temp;
复制代码
-- 客户线索表  

-- 第一步: 创建一张客户线索表的暂时表
  1. CREATE TABLE IF NOT EXISTS itcast_ods.customer_clue_temp (
  2.   id int COMMENT 'customer_clue_id',
  3.   create_date_time STRING COMMENT '创建时间',
  4.   update_date_time STRING COMMENT '最后更新时间',
  5.   deleted STRING COMMENT '是否被删除(禁用)',
  6.   customer_id int COMMENT '客户id',
  7.   customer_relationship_id int COMMENT '客户关系id',
  8.   session_id STRING COMMENT '七陌会话id',
  9.   sid STRING COMMENT '访客id',
  10.   status STRING COMMENT '状态(undeal待领取 deal 已领取 finish 已关闭 changePeer 已流转)',
  11.   users STRING COMMENT '所属坐席',
  12.   create_time STRING COMMENT '七陌创建时间',
  13.   platform STRING COMMENT '平台来源 (pc-网站咨询|wap-wap咨询|sdk-app咨询|weixin-微信咨询)',
  14.   s_name STRING COMMENT '用户名称',
  15.   seo_source STRING COMMENT '搜索来源',
  16.   seo_keywords STRING COMMENT '关键字',
  17.   ip STRING COMMENT 'IP地址',
  18.   referrer STRING COMMENT '上级来源页面',
  19.   from_url STRING COMMENT '会话来源页面',
  20.   landing_page_url STRING COMMENT '访客着陆页面',
  21.   url_title STRING COMMENT '咨询页面title',
  22.   to_peer STRING COMMENT '所属技能组',
  23.   manual_time STRING COMMENT '人工开始时间',
  24.   begin_time STRING COMMENT '坐席领取时间 ',
  25.   reply_msg_count int COMMENT '客服回复消息数',
  26.   total_msg_count int COMMENT '消息总数',
  27.   msg_count int COMMENT '客户发送消息数',
  28.   comment STRING COMMENT '备注',
  29.   finish_reason STRING COMMENT '结束类型',
  30.   finish_user STRING COMMENT '结束坐席',
  31.   end_time STRING COMMENT '会话结束时间',
  32.   platform_description STRING COMMENT '客户平台信息',
  33.   browser_name STRING COMMENT '浏览器名称',
  34.   os_info STRING COMMENT '系统名称',
  35.   area STRING COMMENT '区域',
  36.   country STRING COMMENT '所在国家',
  37.   province STRING COMMENT '省',
  38.   city STRING COMMENT '城市',
  39.   creator int COMMENT '创建人',
  40.   name STRING COMMENT '客户姓名',
  41.   idcard STRING COMMENT '身份证号',
  42.   phone STRING COMMENT '手机号',
  43.   itcast_school_id int COMMENT '校区Id',
  44.   itcast_school STRING COMMENT '校区',
  45.   itcast_subject_id int COMMENT '学科Id',
  46.   itcast_subject STRING COMMENT '学科',
  47.   wechat STRING COMMENT '微信',
  48.   qq STRING COMMENT 'qq号',
  49.   email STRING COMMENT '邮箱',
  50.   gender STRING COMMENT '性别',
  51.   level STRING COMMENT '客户级别',
  52.   origin_type STRING COMMENT '数据来源渠道',
  53.   information_way STRING COMMENT '资讯方式',
  54.   working_years STRING COMMENT '开始工作时间',
  55.   technical_directions STRING COMMENT '技术方向',
  56.   customer_state STRING COMMENT '当前客户状态',
  57.   valid STRING COMMENT '该线索是否是网资有效线索',
  58.   anticipat_signup_date STRING COMMENT '预计报名时间',
  59.   clue_state STRING COMMENT '线索状态',
  60.   scrm_department_id int COMMENT 'SCRM内部部门id',
  61.   superior_url STRING COMMENT '诸葛获取上级页面URL',
  62.   superior_source STRING COMMENT '诸葛获取上级页面URL标题',
  63.   landing_url STRING COMMENT '诸葛获取着陆页面URL',
  64.   landing_source STRING COMMENT '诸葛获取着陆页面URL来源',
  65.   info_url STRING COMMENT '诸葛获取留咨页URL',
  66.   info_source STRING COMMENT '诸葛获取留咨页URL标题',
  67.   origin_channel STRING COMMENT '投放渠道',
  68.   course_id int COMMENT '课程编号',
  69.   course_name STRING COMMENT '课程名称',
  70.   zhuge_session_id STRING COMMENT 'zhuge会话id',
  71.   is_repeat int COMMENT '是否重复线索(手机号维度) 0:正常 1:重复',
  72.   tenant int COMMENT '租户id',
  73.   activity_id STRING COMMENT '活动id',
  74.   activity_name STRING COMMENT '活动名称',
  75.   follow_type int COMMENT '分配类型,0-自动分配,1-手动分配,2-自动转移,3-手动单个转移,4-手动批量转移,5-公海领取',
  76.   shunt_mode_id int COMMENT '匹配到的技能组id',
  77.   shunt_employee_group_id int COMMENT '所属分流员工组',
  78.   ends_time STRING COMMENT '有效时间')
  79. comment '客户关系表'
  80. PARTITIONED BY(starts_time STRING)
  81. ROW FORMAT DELIMITED
  82. FIELDS TERMINATED BY '\t'
  83. stored as orc
  84. TBLPROPERTIES ('orc.compress'='ZLIB');
复制代码
-- 第二步: 编写sqoop命令 将数据导入到暂时表
  1. sqoop import \
  2. --connect jdbc:mysql://192.168.52.150:3306/scrm \
  3. --username root \
  4. --password 123456 \
  5. --query 'SELECT
  6.   id,create_date_time,update_date_time,deleted,customer_id,customer_relationship_id,session_id,sid,status,user as users,create_time,platform,s_name,seo_source,seo_keywords,ip,referrer,from_url,landing_page_url,url_title,to_peer,manual_time,begin_time,reply_msg_count,total_msg_count,msg_count,comment,finish_reason,finish_user,end_time,platform_description,browser_name,os_info,area,country,province,city,creator,name,"-1" as idcard,"-1" as phone,itcast_school_id,itcast_school,itcast_subject_id,itcast_subject,"-1" as wechat,"-1" as qq,"-1" as email,gender,level,origin_type,information_way,working_years,technical_directions,customer_state,valid,anticipat_signup_date,clue_state,scrm_department_id,superior_url,superior_source,landing_url,landing_source,info_url,info_source,origin_channel,course_id,course_name,zhuge_session_id,is_repeat,tenant,activity_id,activity_name,follow_type,shunt_mode_id,shunt_employee_group_id, "9999-12-31" as ends_time , "2021-09-27" AS starts_time
  7. FROM customer_clue where 1=1 and $CONDITIONS' \
  8. --hcatalog-database itcast_ods \
  9. --hcatalog-table customer_clue_temp \
  10. -m 1
复制代码
-- 第三步: 实行 insert into + select 导入到目的表
  1. insert into table itcast_ods.customer_clue partition(starts_time)
  2. select * from itcast_ods.customer_clue_temp;
复制代码
数据洗濯转换:

生成DWD层数据:

   作用:洗濯和转化以及少量的维度退化
  维度退化利用: 此层不需要做
  洗濯利用: 
    将标记删除的数据过滤掉   
转换利用: 
    1) 将create_date_time 转换为 yearinfo  monthinfo dayinfo hourinfo
    2) 将origin_type 转换为 origin_type_state (用于统计线上线下)
           转换逻辑: origin_type的值为: NETSERVICE 大概 PRESIGNUP 认为线上 别的认为线下
    3) 将clue_state 转换为 clue_state_stat (用于统计新老维度)  -- 当前层无法转换的 (只能在DWM),因为要关联其他表
        转换逻辑:clue_state的值为 VALID_NEW_CLUES 为新客户  别的暂定为老客户
    4) 将校区和学科的 id字段, 假如为 0 大概 null 转换为 -1
  盼望在灌入到DWD层的时间, 对数据举行采样利用: 比如只想要第5个桶,条件是一共有10个桶
所以末了结果是只有一个桶里面有数据,别的都是空,因为只采样了一个桶,为了节省时间,101个分区,每个分区10个桶太多了,所以只采样一个桶。 
  1. --分区
  2. SET hive.exec.dynamic.partition=true;
  3. SET hive.exec.dynamic.partition.mode=nonstrict;
  4. set hive.exec.max.dynamic.partitions.pernode=10000;
  5. set hive.exec.max.dynamic.partitions=100000;
  6. set hive.exec.max.created.files=150000;
  7. --hive压缩
  8. set hive.exec.compress.intermediate=true;
  9. set hive.exec.compress.output=true;
  10. --写入时压缩生效
  11. set hive.exec.orc.compression.strategy=COMPRESSION;
  12. --分桶
  13. set hive.enforce.bucketing=true; -- 开启分桶支持, 默认就是true
  14. set hive.enforce.sorting=true; -- 开启强制排序
  15. insert  into table itcast_dwd.itcast_intention_dwd partition(yearinfo,monthinfo,dayinfo)
  16. select  
  17.     id as rid,
  18.     customer_id,
  19.     create_date_time,
  20.     if(itcast_school_id is null OR itcast_school_id = 0 , '-1',itcast_school_id) as itcast_school_id,
  21.     deleted,
  22.     origin_type,
  23.     if(itcast_subject_id is not null, if(itcast_subject_id != 0,itcast_subject_id,'-1'),'-1') as itcast_subject_id,
  24.     creator,
  25.     substr(create_date_time,12,2) as hourinfo,
  26.     if(origin_type in('NETSERVICE','PRESIGNUP'),'1','0') as origin_type_stat,
  27.     substr(create_date_time,1,4) as yearinfo,
  28.     substr(create_date_time,6,2) as monthinfo,
  29.     substr(create_date_time,9,2) as dayinfo
  30. from itcast_ods.customer_relationship tablesample(bucket 5 out of 10 on id) where deleted = 0 ;
复制代码
生成DWM层数据:

由于DWM层的字段是来源于事实表和所有维度表中的字段, 此时假如生成DWM层数据, 必须要先将所有的表关联在一起,七表关联数据巨大,要开启各种优化。
   所有表的表与表之间的关联条件 :
    客户意向表.creator = 员工表.id
    员工表.tdepart_id = 部门表.id
    线索表.customer_relationship_id = 客户意向表.id
    客户意向表.itcast_school_id = 校区表.id
    客户意向表.itcast_subject_id = 学科表.id
    客户意向表.customer_id = 客户表.id
   相关优化:
  1. 开启优化:
  2. --分区
  3. SET hive.exec.dynamic.partition=true;
  4. SET hive.exec.dynamic.partition.mode=nonstrict;
  5. set hive.exec.max.dynamic.partitions.pernode=10000;
  6. set hive.exec.max.dynamic.partitions=100000;
  7. set hive.exec.max.created.files=150000;
  8. --hive压缩
  9. set hive.exec.compress.intermediate=true;
  10. set hive.exec.compress.output=true;
  11. --写入时压缩生效
  12. set hive.exec.orc.compression.strategy=COMPRESSION;
  13. --分桶
  14. set hive.enforce.bucketing=true; -- 开启分桶支持, 默认就是true
  15. set hive.enforce.sorting=true; -- 开启强制排序
  16. -- 优化:
  17. set hive.auto.convert.join=true;  -- map join
  18. set hive.optimize.bucketmapjoin = true; -- 开启 bucket map join
  19. -- 开启SMB map join
  20. set hive.auto.convert.sortmerge.join=true;
  21. set hive.auto.convert.sortmerge.join.noconditionaltask=true;
  22. -- 写入数据强制排序
  23. set hive.enforce.sorting=true;
  24. set hive.optimize.bucketmapjoin.sortedmerge = true; -- 开启自动尝试SMB连接
复制代码
注意:相关优化全部开启
   阐明:
    通过实行发现, 开启优化, 实行速度, 非常的迟钝, 一分钟才可以实行  1% 
  缘故原由:    
    当前这种优化方案, 需要有非常的内存资源才可以运行, 假如没有, yarn会安排这些依次实行,导致实行效率更差
    假如在生产环境中, 是完全可以开启的
  现在解决方案: 关闭掉所有的优化来实行
set hive.auto.convert.join=false; 
set hive.optimize.bucketmapjoin = false; 
  set hive.auto.convert.sortmerge.join=false;
set hive.auto.convert.sortmerge.join.noconditionaltask=false;
  set hive.enforce.sorting=false;
  set hive.optimize.bucketmapjoin.sortedmerge = false; 
  1. --分区
  2. SET hive.exec.dynamic.partition=true;
  3. SET hive.exec.dynamic.partition.mode=nonstrict;
  4. set hive.exec.max.dynamic.partitions.pernode=10000;
  5. set hive.exec.max.dynamic.partitions=100000;
  6. set hive.exec.max.created.files=150000;
  7. --hive压缩
  8. set hive.exec.compress.intermediate=true;
  9. set hive.exec.compress.output=true;
  10. --写入时压缩生效
  11. set hive.exec.orc.compression.strategy=COMPRESSION;
  12. --分桶
  13. set hive.enforce.bucketing=true; -- 开启分桶支持, 默认就是true
  14. set hive.enforce.sorting=true; -- 开启强制排序
  15. -- 优化:
  16. set hive.auto.convert.join=false;  -- map join
  17. set hive.optimize.bucketmapjoin = false; -- 开启 bucket map join
  18. -- 开启SMB map join
  19. set hive.auto.convert.sortmerge.join=false;
  20. set hive.auto.convert.sortmerge.join.noconditionaltask=false;
  21. -- 写入数据强制排序
  22. set hive.enforce.sorting=false;
  23. -- 开启自动尝试SMB连接
  24. set hive.optimize.bucketmapjoin.sortedmerge = false;
  25. insert into table itcast_dwm.itcast_intention_dwm partition(yearinfo,monthinfo,dayinfo)
  26. select  
  27.     iid.customer_id,
  28.     iid.create_date_time,
  29.     c.area,
  30.     iid.itcast_school_id,
  31.     sch.name as itcast_school_name,
  32.     iid.deleted,
  33.     iid.origin_type,
  34.     iid.itcast_subject_id,
  35.     sub.name as itcast_subject_name,
  36.     iid.hourinfo,
  37.     iid.origin_type_stat,
  38.     -- if(cc.clue_state = 'VALID_NEW_CLUES',1,if(cc.clue_state = 'VALID_PUBLIC_NEW_CLUE','0','-1')) as clue_state_stat, -- 此处有转换
  39.     case cc.clue_state
  40.         when 'VALID_NEW_CLUES' then '1'
  41.         when 'VALID_PUBLIC_NEW_CLUE' then '0'
  42.         else '-1'
  43.     end as clue_state_stat,
  44.     emp.tdepart_id,
  45.     dept.name as tdepart_name,
  46.     iid.yearinfo,
  47.     iid.monthinfo,
  48.     iid.dayinfo
  49. from itcast_dwd.itcast_intention_dwd  iid
  50.     left join itcast_ods.customer_clue cc on cc.customer_relationship_id = iid.rid
  51.     left join itcast_dimen.customer c on  iid.customer_id = c.id
  52.     left join itcast_dimen.itcast_subject sub on  iid.itcast_subject_id = sub.id
  53.     left join itcast_dimen.itcast_school sch  on iid.itcast_school_id = sch.id
  54.     left join itcast_dimen.employee emp on iid.creator = emp.id
  55.     left join itcast_dimen.scrm_department dept on emp.tdepart_id = dept.id;
复制代码
数据分析:

所有需求都放入DWM表中)
目的: 生产DWS层的数据, 数据来源于DWM
   指标:
                  意向量
  维度: 
                固有维度:  时间(年 月 日 小时), 线上线下, 新老维度
                产物属性维度: 地域, 学科维度, 校区维度, 咨询中心维度, 来源渠道,总意向量
  6*6=36个需求
  统计总意向量:

   -- 统计每年 线上线下 新老用户的总意向量(3个需求汇到一张表中)
  -- 统计每年每月 线上线下 新老用户的总意向量3个需求汇到一张表中)
  -- 统计每年每月逐日 线上线下 新老用户的总意向量3个需求汇到一张表中)
  -- 统计每年每月逐日每小时 线上线下 新老用户的总意向量3个需求汇到一张表中)
  1. -- 统计每年 线上线下 新老用户的总意向量
  2. insert into table itcast_dws.itcast_intention_dws partition(yearinfo,monthinfo,dayinfo)
  3. select
  4.         count( distinct customer_id) as customer_total,
  5.         '-1' as area,
  6.         '-1' as itcast_school_id,
  7.         '-1' as itcast_school_name,
  8.         '-1' as origin_type,
  9.         '-1' as itcast_subject_id,
  10.         '-1' as itcast_subject_name,
  11.         '-1' as hourinfo,
  12.         origin_type_stat,
  13.         clue_state_stat,
  14.         '-1' as tdepart_id,
  15.         '-1' as tdepart_name,
  16.         yearinfo as time_str,
  17.         '1' as grouptype,
  18.         '5' as time_type,
  19.         yearinfo,
  20.         '-1' as monthinfo,
  21.         '-1' as dayinfo
  22. from itcast_dwm.itcast_intention_dwm
  23. group by yearinfo,origin_type_stat,clue_state_stat;
  24. -- 统计每年每月 线上线下 新老用户的总意向量
  25. insert into table itcast_dws.itcast_intention_dws partition(yearinfo,monthinfo,dayinfo)
  26. select
  27.         count( distinct customer_id) as customer_total,
  28.         '-1' as area,
  29.         '-1' as itcast_school_id,
  30.         '-1' as itcast_school_name,
  31.         '-1' as origin_type,
  32.         '-1' as itcast_subject_id,
  33.         '-1' as itcast_subject_name,
  34.         '-1' as hourinfo,
  35.         origin_type_stat,
  36.         clue_state_stat,
  37.         '-1' as tdepart_id,
  38.         '-1' as tdepart_name,
  39.         concat(yearinfo,'-',monthinfo) as time_str,
  40.         '1' as grouptype,
  41.         '4' as time_type,
  42.         yearinfo,
  43.         monthinfo,
  44.         '-1' as dayinfo
  45. from itcast_dwm.itcast_intention_dwm
  46. group by yearinfo,monthinfo,origin_type_stat,clue_state_stat;
  47. -- 统计每年每月每日 线上线下 新老用户的总意向量
  48. insert into table itcast_dws.itcast_intention_dws partition(yearinfo,monthinfo,dayinfo)
  49. select
  50.         count( distinct customer_id) as customer_total,
  51.         '-1' as area,
  52.         '-1' as itcast_school_id,
  53.         '-1' as itcast_school_name,
  54.         '-1' as origin_type,
  55.         '-1' as itcast_subject_id,
  56.         '-1' as itcast_subject_name,
  57.         '-1' as hourinfo,
  58.         origin_type_stat,
  59.         clue_state_stat,
  60.         '-1' as tdepart_id,
  61.         '-1' as tdepart_name,
  62.         concat(yearinfo,'-',monthinfo,'-',dayinfo) as time_str,
  63.         '1' as grouptype,
  64.         '2' as time_type,
  65.         yearinfo,
  66.         monthinfo,
  67.         dayinfo
  68. from itcast_dwm.itcast_intention_dwm
  69. group by yearinfo,monthinfo,dayinfo,origin_type_stat,clue_state_stat;
  70. -- 统计每年每月每日每小时 线上线下 新老用户的总意向量
  71. insert into table itcast_dws.itcast_intention_dws partition(yearinfo,monthinfo,dayinfo)
  72. select
  73.         count( distinct customer_id) as customer_total,
  74.         '-1' as area,
  75.         '-1' as itcast_school_id,
  76.         '-1' as itcast_school_name,
  77.         '-1' as origin_type,
  78.         '-1' as itcast_subject_id,
  79.         '-1' as itcast_subject_name,
  80.         hourinfo,
  81.         origin_type_stat,
  82.         clue_state_stat,
  83.         '-1' as tdepart_id,
  84.         '-1' as tdepart_name,
  85.         concat(yearinfo,'-',monthinfo,'-',dayinfo,' ',hourinfo) as time_str,
  86.         '1' as grouptype,
  87.         '1' as time_type,
  88.         yearinfo,
  89.         monthinfo,
  90.         dayinfo
  91. from itcast_dwm.itcast_intention_dwm
  92. group by yearinfo,monthinfo,dayinfo,hourinfo,origin_type_stat,clue_state_stat;
复制代码
统计咨询中心维度:

   -- 统计每年线上线下, 新老用户产生各个咨询中心的意向量(2个需求汇到一张表中)
  1. -- 统计每年线上线下, 新老用户产生各个咨询中心的意向量
  2. insert into table itcast_dws.itcast_intention_dws partition(yearinfo,monthinfo,dayinfo)
  3. select
  4.         count( distinct customer_id) as customer_total,
  5.         '-1' as area,
  6.         '-1' as itcast_school_id,
  7.         '-1' as itcast_school_name,
  8.         '-1' as origin_type,
  9.         '-1' as itcast_subject_id,
  10.         '-1' as itcast_subject_name,
  11.         '-1' as hourinfo,
  12.         origin_type_stat,
  13.         clue_state_stat,
  14.         tdepart_id,
  15.         tdepart_name,
  16.         yearinfo as time_str,
  17.         '5' as grouptype,
  18.         '5' as time_type,
  19.         yearinfo,
  20.         '-1' as monthinfo,
  21.         '-1' as dayinfo
  22. from itcast_dwm.itcast_intention_dwm
  23. group by yearinfo,origin_type_stat,clue_state_stat,tdepart_id,tdepart_name;
复制代码
数据导出:

目的: 从DWS层将数据导出到MYSQL中
第一步: 在mysql中创建目的表
  1. CREATE TABLE IF NOT EXISTS scrm_bi.itcast_intention (
  2.    `customer_total` INT COMMENT '聚合意向客户数',
  3.    `area` varchar(100) COMMENT '区域信息',
  4.    `itcast_school_id` varchar(100) COMMENT '校区id',
  5.    `itcast_school_name` varchar(100) COMMENT '校区名称',
  6.    `origin_type` varchar(100) COMMENT '来源渠道',
  7.    `itcast_subject_id` varchar(100) COMMENT '学科id',
  8.    `itcast_subject_name` varchar(100) COMMENT '学科名称',
  9.    `hourinfo` varchar(100) COMMENT '小时信息',
  10.    `origin_type_stat` varchar(100) COMMENT '数据来源:0.线下;1.线上',
  11.    `clue_state_stat` varchar(100) COMMENT '客户属性:0.老客户;1.新客户',
  12.    `tdepart_id` varchar(100) COMMENT '创建者部门id',
  13.    `tdepart_name` varchar(100) COMMENT '咨询中心名称',
  14.    `time_str` varchar(100) COMMENT '时间明细',
  15.    `groupType` varchar(100) COMMENT '产品属性类别:1.总意向量;2.区域信息;3.校区、学科组合分组;4.来源渠道;5.咨询中心;',
  16.    `time_type` varchar(100) COMMENT '时间维度:1、按小时聚合;2、按天聚合;3、按周聚合;4、按月聚合;5、按年聚合;',
  17.     yearinfo varchar(100) COMMENT '年' ,
  18.     monthinfo varchar(100) COMMENT '月',
  19.     dayinfo varchar(100) COMMENT '日'
  20. )
  21. comment '客户意向dws表';
复制代码
第二步:实行sqoop, 将数据全部到导出 MySQL中
  1. sqoop export \
  2. --connect "jdbc:mysql://192.168.52.150:3306/scrm_bi?useUnicode=true&characterEncoding=utf-8" \
  3. --username root \
  4. --password 123456 \
  5. --table itcast_intention \
  6. --hcatalog-database itcast_dws \
  7. --hcatalog-table itcast_intention_dws \
  8. -m 1
复制代码
访问和咨询用户数据模块(增量分析):略(类比第一模块)

有效线索模块:

开辟中,流程类似第一第二模块……
报名用户模块:

 开辟中,流程类似第一第二模块……
学生出勤模块:

衔接第三部分,第三部分请点击:基于Hive的教育平台数据堆栈分析案例 (三)

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表