一、需求背景
- 离线任务场景,每日产出一份
- 汇总上游订单、点击数据,输出大客户的汇总数据
- 和上游、下游系统之间的交互都是hdfs文件
二、详细介绍
- 产出文件中 totalCount为当天userId的总营收
- 产出文件中totalClick 为当天userId的总点击
- 订单数据中需要根据订单状态过滤,只统计交易成功(orderStatus=2)的订单
三、方案代码:
当然可以使用你最熟悉的开发语言去写代码实现,本文用awk来实现,相比之下,性能极高。
注释版:
代码语言:javascript复制#!/bin/sh
awk -F 't|x01' '
ARGIND==1{ // awk可同时操作多个文件,此处表示第一个文件 ka_20200308
userid[$1]=1; // 这几行都表示初始化数组,key为userid
username[$1]=$2;
userphone[$1]=$3;
income[$1]=0;
click[$1]=0;
}
ARGIND==2{ // 遍历第二个文件每行进行处理 order_20200308
if($3==1 && userid[$1]){ // 如果此行订单为已完成,则把金额汇总到对应userid
income[$1] =$2;
}
}
ARGIND==3{ // 第三个文件 cick_20200308
if(userid[$4]){ // 汇总userid点击数
click[$4] ;
}
}
END{ // 最后汇总并且格式化输出逻辑
for(k in userid){
print k"t"username[k]"t"userphone[k]"t"income[k]"t"click[k]
}
}
' ka_20200308 order_20200308 click_20200308 >> output_20200308
纯享版:
代码语言:javascript复制#!/bin/sh
awk -F 't|x01' '
ARGIND==1{
userid[$1]=1;
username[$1]=$2;
userphone[$1]=$3;
income[$1]=0;
click[$1]=0;
}
ARGIND==2{
if($3==1 && userid[$1]){
income[$1] =$2;
}
}
ARGIND==3{
if(userid[$4]){
click[$4] ;
}
}
END{
for(k in userid){
print k"t"username[k]"t"userphone[k]"t"income[k]"t"click[k]
}
}
' ka_20200308 order_20200308 click_20200308 >> output_20200308