第三个业务:用户画像 - 统计当天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 -支付宝用户全量表 【全量导入】

user_wechat_baseinfo - TO_YCAK_USR_D -微信用户全量表 【全量导入】

user_qq_baseinfo - TO_YCAK_USR_QQ_D -QQ用户日全量表 【全量导入】

user_app_baseinfo - TO_YCAK_USR_APP_D -APP用户信息日全量表【全量导入】

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

EDS层: - 用户主题
TW_USR_BASEINFO_D - 活跃用户基础信息日增量表

没有把增量导入的表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 ]; thenecho "====没有导入数据的日期,输入日期===="exit
elseecho "====使用导入数据的日期 ===="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 ]; thenecho "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.userimport 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_RUNprivate val hiveMetaStoreUris = ConfigUtils.HIVE_METASTORE_URISprivate val hiveDataBase = ConfigUtils.HIVE_DATABASEprivate var sparkSession : SparkSession = _private val mysqlUrl = ConfigUtils.MYSQL_URLprivate val mysqlUser = ConfigUtils.MYSQL_USERprivate val mysqlPassword = ConfigUtils.MYSQL_PASSWORDdef 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 > 前7日 and  data_dt < 当前天 haveing c = 7) t1,TW_USR_BASEINFO_D t2
where t1.uid = t2.uid and  t2.data_dt = 当前天

2021.5.16数仓之用户画像表模型设计相关推荐

  1. 数仓建模—用户旅程地图

    用户旅程地图 前面介绍了用户画像相关的一些东西,可以参考数仓建模-用户画像,今天我们介绍另外一个和用户相关的,那就是用户旅程地图,只不过用户旅程地图是强依赖我们的日志数据的,所以建议参考前面的文章数仓 ...

  2. 用户画像 用户画像表

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 用户画像  总文章 ================ 用户画像 ...

  3. 数仓建模,宽表是什么?如何设计?

    数仓建模,宽表是什么?如何设计? 宽表的设计 为什么要建设宽表 宽表的好处和不足 如何设计宽表 总结 宽表的设计 其实宽表是数仓里面非常重要的一块,宽表主要出现在dwd 层和报表层,当然有的人说dws ...

  4. 【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. [hive]数仓分层|用户纬度拉链表|维度建模

    https://www.modb.pro/404?redirect=%2Fdb%2F241289 一.数仓分层 1.ODS层:原始数据层 ODS(O=original D=data S=store) ...

  6. 巨量算数 - 抖音用户画像

    2020年8月,巨量算数发布最新抖音用户画像,需要完整报告请关注公众号回复"2020年抖音用户画像"即可获取! 如果大家身边也有需要这些资料的人,在分享的同时,麻烦也关注下该公众号 ...

  7. 数据分析基础篇16讲之07用户画像:标签化就是数据的抽象能力

    07 用户画像:标签化就是数据的抽象能力 用户画像建模的三个步骤有哪些?以及它每一步骤的目的是什么? 第一步:统一化 目的:用来统计用户的唯一辨识,从而保证该用户的唯一性 第二步:标签化 目的:给用户 ...

  8. 2021.5.9数仓之机器详情ODS EDS DM分层设计

    第二个业务:机器详细信息统计 需求 目前要根据两个业务系统中的数据统计机器基础详细信息.这两个业务系统对应的关系型数据库分别是"ycak""ycbk". &qu ...

  9. 数仓模型之维度表技术

    维度表概念 维, 是人们观察数据的特定角度,是考虑问题时的一类属性,属性集合构成一个维. 维度是维度建模的基础和灵魂. 维度属性是查询约束条件.分组和报表标签生成的基本来源,是数据易用性的关键. 维度 ...

最新文章

  1. vb listview 修改
  2. MySQL模拟oracle的connect by
  3. pom.xml配置文件中所有标签及作用简单描述
  4. 【数据库】13种会导致索引失效语句写法
  5. linux 蓝牙脚本,linux下蓝牙开发(bluez应用)
  6. Redis实现延迟队列
  7. Python表示不甘心,汤姆大叔送书,Python抢书之毫秒级跟进--获取服务器时间
  8. 无人驾驶入门(影子测试)
  9. 如何配置cocos2d-x安卓开发环境?
  10. 12557是oracle什么错误吗,在做oracle standby时,出现ORA-12557错误.
  11. 云计算技术架构-云计算四种模式(公有云、私有云、混合云、行业云)
  12. smss.exe是什么进程?详解Windows会话管理器中的smss.exe
  13. exec()和eval()
  14. python import变灰_pycharm中import呈现灰色原因的解决方法
  15. 肇庆学院"菜鸟杯"程序设计竞赛2019(同步赛)(回顾补题)
  16. mysql中information_schema.columns字段说明
  17. 实践 | Face-API实现人脸识别(附源代码)
  18. 2018福大软工实践第十次作业
  19. springboot2.x项目中正确使用logback-spring.xml的方式
  20. NetInside网络流量监控助力某企业提高系统性能

热门文章

  1. 深度学习基于DEAP的脑电情绪识别情感分类(附代码)
  2. Unequal Array
  3. [实用工具] 如何免费下载 IEEE、ECCV、ICCV、CVPR、ACL等文章!
  4. 大数据治理运营整体解决方案
  5. rails 单复数转换
  6. 如何转换swf格式的文件?
  7. PyQT5 - 打包为.EXE文件
  8. 输入年和月份,输出这一年该月份有多少天。
  9. 【OJ每日一练】1074 - 振兴中华
  10. 大数据盘点2019上半年倒闭的44家餐厅的7种死法,千万别中招了!