需求
现有用户点击行为数据文件,每天产生会上传到hdfs目录,按天区分目录,现在我们需要每天凌晨两点定时导入Hive
表指定分区中,并统计出今日活跃用户数插入指标表中。
日志文件
clicklog
userId click_time index
uid1 2020-06-21 12:10:10 a.html
uid2 2020-06-21 12:15:10 b.html
uid1 2020-06-21 13:10:10 c.html
uid1 2020-06-21 15:10:10 d.html
uid2 2020-06-21 18:10:10 e.html
用户点击行为数据,三个字段是用户id,点击时间,访问页面
hdfs目录会以日期划分文件,例如:
/user_clicks/20200621/clicklog.dat
/user_clicks/20200622/clicklog.dat
/user_clicks/20200623/clicklog.dat
Hive表
原始数据分区表
create table user_clicks(id string,click_time string index string) partitioned by(dt string) row format delimited fields terminated by ‘\t’ ;
需要开发一个import.job每日从hdfs对应日期目录下同步数据到该表指定分区。(日期格式同上或者自定义)
指标表
create table user_info(active_num string,date string) row format delimited fields terminated by ‘\t’ ;
需要开发一个analysis.job依赖import.job执行,统计出每日活跃用户(一个用户出现多次算作一次)数并插入
user_inof表中。
作业:
开发以上提到的两个job,job文件内容和sql内容需分开展示,并能使用azkaban调度执行。
思路
1.指定hdfs目录存放每天的用户点击日志
2.创建定时任务import1,同步数据到指定分区;
3.使用定时任务统计出每日活跃用户插入user_info中
4.定时任务使用方式假设对前一天的数据进行分析,下列shell中日期都取得是前一天
1.数据准备
2 import.job
type=command
command=sh import.sh
3 import.sh
#!/bin/sh
echo 'import data from hdfs。。。'
yesterday=`date -d last-day +%Y%m%d`
echo "昨天时间:'$yesterday'"
/opt/lagou/servers/hive-2.3.7/bin/hive -e "USE default;LOAD DATA INPATH '/lagou/clicklog/$yesterday/*' OVERWRITE INTO TABLE user_clicks PARTITION (dt='$yesterday');"
4 analysis.job
type=command
dependencies=import
command=sh analysis.sh
5 analysis.sh
#!/bin/sh
echo 'analysis user click data。。。'
yesterday=`date -d last-day +%Y%m%d`
echo "昨天时间:'$yesterday'"
/opt/lagou/servers/hive-2.3.7/bin/hive -e "USE default;INSERT INTO TABLE user_info (SELECT id , dt FROM user_clicks where dt = '$yesterday' GROUP BY dt,id);"
schedule
执行结果
import
analysis
hive结果