大数据全系列 教程
1869个小节阅读:467.7k
目录
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
由于统计的是用户的数量,需要对log进行uuid的过滤,因为同一个人有可能点击了多次。
xxxxxxxxxx
package cn.itbaizhan.tranformer.mr;
import cn.itbaizhan.common.EventLogConstants;
import cn.itbaizhan.common.KpiType;
import cn.itbaizhan.tranformer.model.MapWritableValue;
import cn.itbaizhan.tranformer.model.StatsUserDimesion;
import cn.itbaizhan.tranformer.model.TimeOutputValue;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.MapWritable;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
/**输入 key:StatsUserDimension value:TimeOutputValue
* 输出 key:StatsUserDimension value:MapWritableValue
*/
public class NewInstallUserReducer extends Reducer<StatsUserDimesion, TimeOutputValue,
StatsUserDimesion, MapWritableValue> {
//输出的key使用输入的key即可,所以输出的key对象不需要定义
//定义输出的value对象
private MapWritableValue valueOut = new MapWritableValue();
//由于统计的是新增用户的数量,需要对log进行uuid的去重,因为同一个人在同一天内有可能产生多天新增用户日志
private Set<String> uniqueIds = new HashSet<>();
//-1后续分解
private IntWritable valueOutKey = new IntWritable(-1);
private IntWritable valueOutValue = new IntWritable();
@Override
protected void reduce(StatsUserDimesion key, Iterable<TimeOutputValue> values, Reducer<StatsUserDimesion, TimeOutputValue, StatsUserDimesion, MapWritableValue>.Context context) throws IOException, InterruptedException {
//清空集合对象uniqueIds中数据,避免上一组数组的干扰
uniqueIds.clear();
//遍历values,获取uuid
for(TimeOutputValue value:values){
uniqueIds.add(value.getId());
}
//获取kpi
String kpiName = key.getStatsCommon().getKpi().getKpiName();
//方式一:
/*if(kpiName.equals(EventLogConstants.BROWSER_NEW_INSTALL_USER)){
valueOut.setKpi(KpiType.BROWSER_NEW_INSTALL_USER);
}else if(kpiName.equals(EventLogConstants.NEW_INSTALL_USER)){
valueOut.setKpi(KpiType.NEW_INSTALL_USER);
}*/
//方式二
valueOut.setKpi(KpiType.valueOfName(kpiName));
//定义一个MapWritable对象
MapWritable mapWritable = new MapWritable();
//将新郑用户的数量封装到valueOutValue对象
valueOutValue.set(uniqueIds.size());
//将valueOutKey,valueOutValue封装到mapWritable中
mapWritable.put(valueOutKey,valueOutValue);
valueOut.setValue(mapWritable);
//输出
context.write(key,valueOut);
}
}