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 -支付宝用户全量表 【全量导入】
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数仓之用户画像表模型设计相关推荐
- 数仓建模—用户旅程地图
用户旅程地图 前面介绍了用户画像相关的一些东西,可以参考数仓建模-用户画像,今天我们介绍另外一个和用户相关的,那就是用户旅程地图,只不过用户旅程地图是强依赖我们的日志数据的,所以建议参考前面的文章数仓 ...
- 用户画像 用户画像表
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 用户画像 总文章 ================ 用户画像 ...
- 数仓建模,宽表是什么?如何设计?
数仓建模,宽表是什么?如何设计? 宽表的设计 为什么要建设宽表 宽表的好处和不足 如何设计宽表 总结 宽表的设计 其实宽表是数仓里面非常重要的一块,宽表主要出现在dwd 层和报表层,当然有的人说dws ...
- 【SQL开发实战技巧】系列(三十七):数仓报表场景☞从表内始终只有近两年的数据,要求用两列分别显示其中一年的数据聊行转列隐含信息的重要性
系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...
- [hive]数仓分层|用户纬度拉链表|维度建模
https://www.modb.pro/404?redirect=%2Fdb%2F241289 一.数仓分层 1.ODS层:原始数据层 ODS(O=original D=data S=store) ...
- 巨量算数 - 抖音用户画像
2020年8月,巨量算数发布最新抖音用户画像,需要完整报告请关注公众号回复"2020年抖音用户画像"即可获取! 如果大家身边也有需要这些资料的人,在分享的同时,麻烦也关注下该公众号 ...
- 数据分析基础篇16讲之07用户画像:标签化就是数据的抽象能力
07 用户画像:标签化就是数据的抽象能力 用户画像建模的三个步骤有哪些?以及它每一步骤的目的是什么? 第一步:统一化 目的:用来统计用户的唯一辨识,从而保证该用户的唯一性 第二步:标签化 目的:给用户 ...
- 2021.5.9数仓之机器详情ODS EDS DM分层设计
第二个业务:机器详细信息统计 需求 目前要根据两个业务系统中的数据统计机器基础详细信息.这两个业务系统对应的关系型数据库分别是"ycak""ycbk". &qu ...
- 数仓模型之维度表技术
维度表概念 维, 是人们观察数据的特定角度,是考虑问题时的一类属性,属性集合构成一个维. 维度是维度建模的基础和灵魂. 维度属性是查询约束条件.分组和报表标签生成的基本来源,是数据易用性的关键. 维度 ...
最新文章
- vb listview 修改
- MySQL模拟oracle的connect by
- pom.xml配置文件中所有标签及作用简单描述
- 【数据库】13种会导致索引失效语句写法
- linux 蓝牙脚本,linux下蓝牙开发(bluez应用)
- Redis实现延迟队列
- Python表示不甘心,汤姆大叔送书,Python抢书之毫秒级跟进--获取服务器时间
- 无人驾驶入门(影子测试)
- 如何配置cocos2d-x安卓开发环境?
- 12557是oracle什么错误吗,在做oracle standby时,出现ORA-12557错误.
- 云计算技术架构-云计算四种模式(公有云、私有云、混合云、行业云)
- smss.exe是什么进程?详解Windows会话管理器中的smss.exe
- exec()和eval()
- python import变灰_pycharm中import呈现灰色原因的解决方法
- 肇庆学院"菜鸟杯"程序设计竞赛2019(同步赛)(回顾补题)
- mysql中information_schema.columns字段说明
- 实践 | Face-API实现人脸识别(附源代码)
- 2018福大软工实践第十次作业
- springboot2.x项目中正确使用logback-spring.xml的方式
- NetInside网络流量监控助力某企业提高系统性能