要统计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 ]; 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 > 前7日 and data_dt < 当前天 haveing c = 7) t1,TW_USR_BASEINFO_D t2
where t1.uid = t2.uid and t2.data_dt = 当前天