2021.5.16数仓之用户画像表模型设计

第三个业务:用户画像 - 统计当天7日活跃用户

业务分析:

要统计7日活跃用户情况需要找到
用户基本信息 & 用户每日登陆情况

用户基本信息来源:
1.支付宝注册用户
2.微信注册用户
3.qq注册用户
4.App注册用户 - 使用app注册点歌充值消费

这4类注册信息在ycak业务库,对应的4类注册用户分别在以下表中,以及表中的字段:

user_alipay_baseinfo

DROP TABLE IF EXISTS `user_alipay_baseinfo`;
CREATE TABLE `user_alipay_baseinfo` (
  `uid` int(100) NOT NULL COMMENT '用户ID',
  `reg_mid` int(100) DEFAULT NULL COMMENT '注册机器ID',
  `sex` varchar(100) DEFAULT NULL COMMENT '性别',
  `birthday` varchar(100) DEFAULT NULL COMMENT '生日',
  `msisdn` varchar(100) DEFAULT NULL COMMENT '手机号码',
  `locationid` int(100) DEFAULT NULL COMMENT '地区ID',
  `mode_type` int(100) DEFAULT NULL COMMENT '注册登录模式',
  `regist_time` varchar(100) DEFAULT NULL COMMENT '注册时间',
  `user_exp` varchar(100) DEFAULT NULL COMMENT '用户当前经验值',
  `score` int(100) DEFAULT NULL COMMENT '累计积分',
  `user_level` int(100) DEFAULT NULL COMMENT '用户等级',
  `user_type` varchar(100) DEFAULT NULL COMMENT '用户类型',
  `is_certified` varchar(100) DEFAULT NULL COMMENT '实名认证',
  `is_student_certified` varchar(100) DEFAULT NULL COMMENT '是否学生',
  `openid` varchar(100) DEFAULT NULL COMMENT '支付宝ID',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

user_wechat_baseinfo

DROP TABLE IF EXISTS `user_wechat_baseinfo`;
CREATE TABLE `user_wechat_baseinfo` (
  `uid` int(100) NOT NULL COMMENT '用户ID',
  `reg_mid` int(100) DEFAULT NULL COMMENT '注册机器ID',
  `sex` varchar(100) DEFAULT NULL COMMENT '性别',
  `birthday` varchar(100) DEFAULT NULL COMMENT '生日',
  `msisdn` varchar(100) DEFAULT NULL COMMENT '手机号码',
  `locationid` int(100) DEFAULT NULL COMMENT '地区ID',
  `mode_type` int(100) DEFAULT NULL COMMENT '注册登录模式',
  `regist_time` varchar(100) DEFAULT NULL COMMENT '注册时间',
  `user_exp` varchar(100) DEFAULT NULL COMMENT '用户当前经验值',
  `score` int(100) DEFAULT NULL COMMENT '累计积分',
  `user_level` int(100) DEFAULT NULL COMMENT '用户等级',
  `wxid` varchar(100) DEFAULT NULL COMMENT '微信ID',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

user_qq_baseinfo

DROP TABLE IF EXISTS `user_qq_baseinfo`;
CREATE TABLE `user_qq_baseinfo` (
  `uid` int(100) NOT NULL COMMENT '用户ID',
  `reg_mid` int(100) DEFAULT NULL COMMENT '注册机器ID',
  `sex` varchar(100) DEFAULT NULL COMMENT '性别',
  `birthday` varchar(100) DEFAULT NULL COMMENT '生日',
  `msisdn` varchar(100) DEFAULT NULL COMMENT '手机号码',
  `locationid` int(100) DEFAULT NULL COMMENT '地区ID',
  `mode_type` int(100) DEFAULT NULL COMMENT '注册登录模式',
  `regist_time` varchar(100) DEFAULT NULL COMMENT '注册时间',
  `user_exp` varchar(100) DEFAULT NULL COMMENT '用户当前经验值',
  `score` int(100) DEFAULT NULL COMMENT '累计积分',
  `user_level` int(100) DEFAULT NULL COMMENT '用户等级',
  `openid` varchar(100) DEFAULT NULL COMMENT 'QQID',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

user_app_baseinfo

DROP TABLE IF EXISTS `user_app_baseinfo`;
CREATE TABLE `user_app_baseinfo` (
  `uid` int(100) NOT NULL COMMENT '用户ID',
  `reg_mid` int(100) DEFAULT NULL COMMENT '注册机器ID',
  `sex` varchar(100) DEFAULT NULL COMMENT '性别',
  `birthday` varchar(100) DEFAULT NULL COMMENT '生日',
  `phone_number` varchar(100) DEFAULT NULL COMMENT '手机号码',
  `locationid` int(100) DEFAULT NULL COMMENT '地区ID',
  `regist_time` varchar(100) DEFAULT NULL COMMENT '注册时间',
  `user_exp` varchar(100) DEFAULT NULL COMMENT '用户当前经验值',
  `user_level` int(100) DEFAULT NULL COMMENT '用户等级',
  `app_uid` varchar(100) DEFAULT NULL COMMENT 'APPID',
  PRIMARY KEY (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

用户每日登陆情况: ycak.user_login_info

DROP TABLE IF EXISTS `user_login_info`;
CREATE TABLE `user_login_info` (
  `id` int(100) NOT NULL COMMENT '自增唯一主键',
  `uid` int(100) DEFAULT NULL COMMENT '用户ID',
  `mid` int(100) DEFAULT NULL COMMENT '机器ID',
  `logintime` varchar(100) DEFAULT NULL COMMENT '登录时间',
  `logouttime` varchar(100) DEFAULT NULL COMMENT '登出时间',
  `mode_type` int(100) DEFAULT NULL COMMENT '登录模式',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

分析完数据来源之后,求7日的活跃用户的计算方式就非常简单,比如要找最近7天哪些用户是连续登陆的,哪个用户在哪一天登陆了哪台机器,用户的基本信息有哪些,比如各自的性别、生日、手机号、地址、经验值等,假设要拿到这些信息,只需要找到最近7日登陆的用户就是最近7日活跃用户,但设计数仓的时候,后续的业务要用到这个业务的分析结果,所以怎么设计的?

数仓分层设计:

ODS层(每个关系型数据库里的信息,都会对应ODS层里的一张表):

user_alipay_baseinfo - TO_YCAK_USR_ALI_D -支付宝用户全量表 【全量导入】
2021.5.16数仓之用户画像表模型设计_第1张图片
user_wechat_baseinfo - TO_YCAK_USR_D -微信用户全量表 【全量导入】
2021.5.16数仓之用户画像表模型设计_第2张图片
user_qq_baseinfo - TO_YCAK_USR_QQ_D -QQ用户日全量表 【全量导入】
2021.5.16数仓之用户画像表模型设计_第3张图片

user_app_baseinfo - TO_YCAK_USR_APP_D -APP用户信息日全量表【全量导入】
2021.5.16数仓之用户画像表模型设计_第4张图片

user_login_info - TO_YCAK_USR_LOGIN_D -用户登录数据表日增量【增量导入】
2021.5.16数仓之用户画像表模型设计_第5张图片考虑这些表是增量的导入还是全量的导入:
规则:前4张表,每张表中的数据量不是太多,并且用户的增量也不是非常频繁,比如一张表如果超过1000w并且这张表每天的增量数据有可能达到千万级别的话,我们就更倾向于设计增量的方式去导入,如果数据达不到这个量,我们就可以采用全量的方式导入。这里考虑到数据增量用户数据不是太多,所以前4张表都是采用全量的方式导入。
用户登陆数据日增量表,考虑到每日登陆的用户有可能非常多,比如登陆一个用户就会产生一条日志,用户退出又登陆,又会产生一条日志数据,同一日期可能会有重复的用户登陆,把它增量的导入到ODS层。

EDS层: - 用户主题
TW_USR_BASEINFO_D - 活跃用户基础信息日增量表
2021.5.16数仓之用户画像表模型设计_第6张图片
没有把增量导入的表TO_YCAK_USR_LOGIN_D直接和其他表关联,我们考虑到后期的业务需要用到第三个业务里面EDS层里面的一些表,我们在设计EDS层表的时候,设计了这么一张表,存储的是每日有哪些用户活跃,即使有用户当日活跃了10次,我们也认为这个用户活跃了1次,每日登陆系统的用户存储到当天的日期里面,再去对应的这4个注册信息表里面,把它们的基础信息关联到,放在一张表里,这里只存的当天登陆的用户有哪些。
这里会设置一个分区表来存储这个数据,如果要计算7日活跃用户,只需要计算最近7天,登录次数等于7的用户。

数据处理:

1.创建对应的hive表:TO_YCAK_USR_ALI_D

CREATE EXTERNAL TABLE `TO_YCAK_USR_ALI_D`(
 `UID` int, 
 `REG_MID` int, 
 `GDR` string, 
 `BIRTHDAY` string,
 `MSISDN` string,
 `LOC_ID` int,
 `LOG_MDE` int,
 `REG_TM` string,
 `USR_EXP` string,
 `SCORE` int,
 `LEVEL` int,
 `USR_TYPE` string,
 `IS_CERT` string,
 `IS_STDNT` string,
 `ALY_ID` string 
 )
ROW FORMAT DELIMITED  FIELDS TERMINATED BY '\t' 
LOCATION 'hdfs://mycluster/user/hive/warehouse/data/user/TO_YCAK_USR_ALI_D';

使用sqoop导入数据:

sqoop import \
--connect jdbc:mysql://mynode2:3306/ycak?dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true\&useUnicode=yes\&characterEncoding=utf8 \
--username root \
--password 123456 \
--table user_alipay_baseinfo \
--target-dir /user/hive/warehouse/data/user/TO_YCAK_USR_ALI_D/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t'

2.创建对应的hive表:TO_YCAK_USR_D

CREATE EXTERNAL TABLE `TO_YCAK_USR_D`(
 `UID` int, 
 `REG_MID` int, 
 `GDR` string, 
 `BIRTHDAY` string,
 `MSISDN` string,
 `LOC_ID` int,
 `LOG_MDE` int,
 `REG_TM` string,
 `USR_EXP` string,
 `SCORE` int,
 `LEVEL` int,
 `WX_ID` string
 )
ROW FORMAT DELIMITED  FIELDS TERMINATED BY '\t' 
LOCATION 'hdfs://mycluster/user/hive/warehouse/data/user/TO_YCAK_USR_D';

使用sqoop导入数据:

sqoop import \
--connect jdbc:mysql://mynode2:3306/ycak?dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true\&useUnicode=yes\&characterEncoding=utf8 \
--username root \
--password 123456 \
--table user_wechat_baseinfo \
--target-dir /user/hive/warehouse/data/user/TO_YCAK_USR_D/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t'

3.创建对应的hive表:TO_YCAK_USR_QQ_D

CREATE EXTERNAL TABLE `TO_YCAK_USR_QQ_D`(
 `UID` int, 
 `REG_MID` int, 
 `GDR` string, 
 `BIRTHDAY` string,
 `MSISDN` string,
 `LOC_ID` int,
 `LOG_MDE` int,
 `REG_TM` string,
 `USR_EXP` string,
 `SCORE` int,
 `LEVEL` int,
 `QQID` string 
 )
ROW FORMAT DELIMITED  FIELDS TERMINATED BY '\t' 
LOCATION 'hdfs://mycluster/user/hive/warehouse/data/user/TO_YCAK_USR_QQ_D';

使用sqoop导入数据:

sqoop import \
--connect jdbc:mysql://mynode2:3306/ycak?dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true\&useUnicode=yes\&characterEncoding=utf8 \
--username root \
--password 123456 \
--table user_qq_baseinfo \
--target-dir /user/hive/warehouse/data/user/TO_YCAK_USR_QQ_D/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t'

4.创建对应的hive表:TO_YCAK_USR_APP_D

CREATE EXTERNAL TABLE `TO_YCAK_USR_APP_D`(
 `UID` int, 
 `REG_MID` int, 
 `GDR` string, 
 `BIRTHDAY` string,
 `MSISDN` string,
 `LOC_ID` int,
 `REG_TM` string,
 `USR_EXP` string,
 `LEVEL` int,
 `APP_ID` string 
 )
ROW FORMAT DELIMITED  FIELDS TERMINATED BY '\t' 
LOCATION 'hdfs://mycluster/user/hive/warehouse/data/user/TO_YCAK_USR_APP_D';

使用sqoop导入数据:

sqoop import \
--connect jdbc:mysql://mynode2:3306/ycak?dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true\&useUnicode=yes\&characterEncoding=utf8 \
--username root \
--password 123456 \
--table user_app_baseinfo \
--target-dir /user/hive/warehouse/data/user/TO_YCAK_USR_APP_D/ \
--delete-target-dir \
--num-mappers 1 \
--fields-terminated-by '\t'

4.创建对应的hive表:TO_YCAK_USR_LOGIN_D

CREATE EXTERNAL TABLE `TO_YCAK_USR_LOGIN_D`(
 `ID` int, 
 `UID` int, 
 `MID` int, 
 `LOGIN_TM` string,
 `LOGOUT_TM` string,
 `MODE_TYPE` int
 )
PARTITIONED BY (`data_dt` string)
ROW FORMAT DELIMITED  FIELDS TERMINATED BY '\t' 
LOCATION 'hdfs://mycluster/user/hive/warehouse/data/user/TO_YCAK_USR_LOGIN_D';

使用sqoop导入数据:

#!/bin/bash
currentDate=`date -d today +"%Y%m%d"`
if [ x"$1" = x ]; then
  echo "====没有导入数据的日期,输入日期===="
  exit
else
  echo "====使用导入数据的日期 ===="
  currentDate=$1  
fi
echo "日期为 : $currentDate"

#查询hive ODS层表 TO_YCAK_USR_LOGIN_D 中目前存在的最大的ID
maxid=`hive -e "select max(id) from TO_YCAK_USR_LOGIN_D"`
echo "Hive ODS层表 TO_YCAK_USR_LOGIN_D 最大的ID是$maxid"
if [ x"$maxid" = xNULL ]; then
  echo "maxid is NULL 重置为0"
  maxid=0
fi

#sqoop 导入数据:
sqoop import \
--connect jdbc:mysql://mynode2:3306/ycak?dontTrackOpenResources=true\&defaultFetchSize=10000\&useCursorFetch=true\&useUnicode=yes\&characterEncoding=utf8 \
--username root \
--password 123456 \
--table user_login_info \
--target-dir /user/hive/warehouse/data/user/TO_YCAK_USR_LOGIN_D/data_dt=${currentDate} \
--num-mappers 1 \
--fields-terminated-by '\t' \
--incremental append \
--check-column id \
--last-value $maxid
#更新Hive 分区
hive -e "alter table TO_YCAK_USR_LOGIN_D add partition(data_dt=${currentDate});"

分析获取:

【TW_USR_BASEINFO_D - 活跃用户基础信息日增量表】

1.从 TO_YCAK_USR_LOGIN_D - 用户登录表中查询所有当前天登录不重复用户

SELECT distinct uid FROM TO_YCAK_USR_LOGIN_D WHERE data_dt = 当前日期  --TEMP1

2.对四类用户注册信息进行数据一致性处理

TO_YCAK_USR_ALI_D	-支付宝用户全量表 	--t1
TO_YCAK_USR_D		-微信用户全量表		--t2
TO_YCAK_USR_QQ_D	-QQ用户日全量表		 --t3
TO_YCAK_USR_APP_D	-APP用户信息日全量表 --t4
t1.union(t2).union(t3).union(t4) -- TEMP2

3.TEMP1 表与 TEMP2 表关联,获取当前天登录的用户基本信息,得到 TEMP_USR_ACTV

package com.msbjy.scala.musicproject.eds.user

import java.util.Properties
import com.msbjy.scala.musicproject.common.{ConfigUtils, DateUtils}
import org.apache.spark.sql.{SaveMode, SparkSession}

/**
  *  由ODS层以下几张表:
  *       TO_YCAK_USR_D        微信用户全量表
  *       TO_YCAK_USR_ALI_D    支付宝用户全量表
  *       TO_YCAK_USR_QQ_D      QQ用户全量表
  *       TO_YCAK_USR_APP_D     APP用户全量表
  *       TO_YCAK_USR_LOGIN_D    用户登录数据表日增量表
  *  生成 EDS层 TW_USR_BASEINFO_D 用户基本信息日全量表
  *  同时向mysql中生成7日活跃用户 DM层数据。
  */

object GenerateTwUsrBaseinfoD {
  private val localRun : Boolean = ConfigUtils.LOCAL_RUN
  private val hiveMetaStoreUris = ConfigUtils.HIVE_METASTORE_URIS
  private val hiveDataBase = ConfigUtils.HIVE_DATABASE
  private var sparkSession : SparkSession = _

  private val mysqlUrl = ConfigUtils.MYSQL_URL
  private val mysqlUser = ConfigUtils.MYSQL_USER
  private val mysqlPassword = ConfigUtils.MYSQL_PASSWORD

  def main(args: Array[String]): Unit = {
    if(args.length < 1) {
      println(s"请输入数据日期,格式例如:年月日(20201231)")
      System.exit(1)
    }

    if(localRun){
      sparkSession = SparkSession.builder().master("local").appName("Generate_TW_Song_Rsi_D")
        .config("spark.sql.shuffle.partitions","1")
        .config("hive.metastore.uris",hiveMetaStoreUris).enableHiveSupport().getOrCreate()
      sparkSession.sparkContext.setLogLevel("Error")
    }else{
      sparkSession = SparkSession.builder().appName("Generate_TW_Song_Rsi_D").enableHiveSupport().getOrCreate()
    }

    val currentDate = args(0)

    sparkSession.sql(s"use $hiveDataBase ")

    //获取微信全量用户信息 ,并注册对应的 TO_YCAK_USR_WX_D 视图
    val usrWx = sparkSession.sql(
      """
        | SELECT
        |  UID,       --用户ID
        |  REG_MID,   --机器ID
        |  "1" AS REG_CHNL,  -- 1-微信渠道,2-支付宝渠道,3-QQ渠道,4-APP渠道
        |  WX_ID AS REF_UID,  --微信账号
        |  GDR,               --性别
        |  BIRTHDAY,          --生日
        |  MSISDN,            --手机号码
        |  LOC_ID,            --地区ID
        |  LOG_MDE,           --注册登录方式
        |  substring(REG_TM,1,8) AS REG_DT,   --注册日期
        |  substring(REG_TM,9,6) AS REG_TM,   --注册时间
        |  USR_EXP,           --用户当前经验值
        |  SCORE,             --累计积分
        |  LEVEL,             --用户等级
        |  "2" AS USR_TYPE,   --用户类型 1-企业 2-个人
        |  NULL AS IS_CERT,   --实名认证
        |  NULL AS IS_STDNT   --是否是学生
        |FROM TO_YCAK_USR_D
      """.stripMargin)

    //获取支付宝用户全量信息,并注册对应的 TO_YCAK_USR_ALI_D 视图
    var usrAli = sparkSession.sql(
      """
        | SELECT
        |  UID,       --用户ID
        |  REG_MID,   --机器ID
        |  "2" AS REG_CHNL,  -- 1-微信渠道,2-支付宝渠道,3-QQ渠道,4-APP渠道
        |  ALY_ID AS REF_UID,  --支付宝账号
        |  GDR,               --性别
        |  BIRTHDAY,          --生日
        |  MSISDN,            --手机号码
        |  LOC_ID,            --地区ID
        |  LOG_MDE,           --注册登录方式
        |  substring(REG_TM,1,8) AS REG_DT,   --注册日期
        |  substring(REG_TM,9,6) AS REG_TM,   --注册时间
        |  USR_EXP,           --用户当前经验值
        |  SCORE,             --累计积分
        |  LEVEL,             --用户等级
        |  NVL(USR_TYPE,"2") AS USR_TYPE,   --用户类型 1-企业 2-个人
        |  IS_CERT ,                  --实名认证
        |  IS_STDNT                   --是否是学生
        |FROM TO_YCAK_USR_ALI_D
      """.stripMargin)

    //获取QQ 用户全量信息 ,并注册对应的 TO_YCAK_USR_QQ_D 视图
    val usrQQ = sparkSession.sql(
      """
        |SELECT
        | UID,       --用户ID
        | REG_MID,   --机器ID
        | "3" AS REG_CHNL,  -- 1-微信渠道,2-支付宝渠道,3-QQ渠道,4-APP渠道
        | QQID AS REF_UID,  --QQ账号
        | GDR,               --性别
        | BIRTHDAY,          --生日
        | MSISDN,            --手机号码
        | LOC_ID,            --地区ID
        | LOG_MDE,           --注册登录方式
        | substring(REG_TM,1,8) AS REG_DT,   --注册日期
        | substring(REG_TM,9,6) AS REG_TM,   --注册时间
        | USR_EXP,           --用户当前经验值
        | SCORE,             --累计积分
        | LEVEL,             --用户等级
        | "2" AS USR_TYPE,   --用户类型 1-企业 2-个人
        | NULL AS IS_CERT,   --实名认证
        | NULL AS IS_STDNT   --是否是学生
        |FROM TO_YCAK_USR_QQ_D
      """.stripMargin)


    //获取APP用户全量信息,并注册对应的 TO_YCAK_USR_APP_D 视图
    val usrApp = sparkSession.sql(
      """
        |SELECT
        | UID,       --用户ID
        | REG_MID,   --机器ID
        | "4" AS REG_CHNL,  -- 1-微信渠道,2-支付宝渠道,3-QQ渠道,4-APP渠道
        | APP_ID AS REF_UID,  --APP账号
        | GDR,               --性别
        | BIRTHDAY,          --生日
        | MSISDN,            --手机号码
        | LOC_ID,            --地区ID
        | NULL AS LOG_MDE,           --注册登录方式
        | substring(REG_TM,1,8) AS REG_DT,   --注册日期
        | substring(REG_TM,9,6) AS REG_TM,   --注册时间
        | USR_EXP,           --用户当前经验值
        | 0 AS SCORE,        --累计积分
        | LEVEL,             --用户等级
        | "2" AS USR_TYPE,   --用户类型 1-企业 2-个人
        | NULL AS IS_CERT,   --实名认证
        | NULL AS IS_STDNT   --是否是学生
        |FROM TO_YCAK_USR_APP_D
      """.stripMargin)

    //获取平台所有用户信息
    val allusrInfo = usrWx.union(usrAli).union(usrQQ).union(usrApp)

    /**
      * 从 TO_YCAK_USR_LOGIN_D 用户登录数据增量表 获取当前登录的用户UID ,并对UID去重
      * 与所有用户信息关联获取当日用户详细信息
      */
    sparkSession.table("TO_YCAK_USR_LOGIN_D")
      .where(s"data_dt = $currentDate")
      .select("UID")
      .distinct()
      .join(allusrInfo,Seq("UID"),"left")
      .createTempView("TEMP_USR_ACTV")

    /**
      * 将以上当日计算得到的活跃用户信息保存至 TW_USR_BASEINFO_D 日增量表中
      */
    sparkSession.sql(
      s"""
        | insert overwrite table TW_USR_BASEINFO_D partition (data_dt = ${currentDate})
        | select * from TEMP_USR_ACTV
      """.stripMargin)

    /***
      *  获取7日 活跃用户信息 保存至 DM 层,保存到mysql songresult库下的 user_active
      *
      */
    //获取7天之前的日期
    val pre7Date = DateUtils.getCurrentDatePreDate(currentDate,7)

    val properties  = new Properties()
    properties.setProperty("user",mysqlUser)
    properties.setProperty("password",mysqlPassword)
    properties.setProperty("driver","com.mysql.jdbc.Driver")

    sparkSession.sql(
      s"""
        | select
        |     A.UID, --用户ID
        |     CASE WHEN B.REG_CHNL = '1' THEN '微信'
        |          WHEN B.REG_CHNL = '2' THEN '支付宝'
        |          WHEN B.REG_CHNL = '3' THEN 'QQ'
        |          WHEN B.REG_CHNL = '4' THEN 'APP'
        |          ELSE '未知' END REG_CHNL,   --注册渠道
        |     B.REF_UID,    --账号ID
        |     CASE WHEN B.GDR = '0' THEN '不明'
        |          WHEN B.GDR = '1' THEN '男'
        |          WHEN B.GDR = '2' THEN '女'
        |          ELSE '不明' END GDR,        --性别
        |     B.BIRTHDAY,   --生日
        |     B.MSISDN,     --手机号码
        |     B.REG_DT,     --注册日期
        |     B.LEVEL       --用户等级
        | from
        |  (
        |     select
        |       UID,count(*) as c
        |     from TW_USR_BASEINFO_D
        |     where data_dt between ${pre7Date} and ${currentDate}
        |     group by UID having c = 1   -- 注意:这里应该写7 ,因为计算的是7日用户活跃情况。
        |  ) A,
        | TW_USR_BASEINFO_D B
        | where B.data_dt =  ${currentDate} and A.UID = B.UID
      """.stripMargin).write.mode(SaveMode.Overwrite).jdbc(mysqlUrl,"user_7days_active",properties)

    println("**** all finished ****")
  }


}

4.查询获取当前日连续7日活跃用户

SELECT UID,REG_MID,REG_CHNL,REF_UID,GDR,BIRTHDAY,MSISDN,LOC_ID,LOG_MDE,REG_DT,REG_TM,USR_EXP,SCORE,LEVEL,USR_TYPE,IS_CERT,IS_STDNT
FROM 
(select uid ,count(uid) c from TW_USR_BASEINFO_D where data_dt >7and  data_dt < 当前天 haveing c = 7) t1,TW_USR_BASEINFO_D t2
where t1.uid = t2.uid and  t2.data_dt = 当前天

你可能感兴趣的:(大数据)