mapreduce实现"浏览该商品的人大多数还浏览了"经典应用
输入:日期 ...cookie id. ...商品id..xx xx xx输出:商品id 商品id列表(按优先级排序,用逗号分隔)xx xx比如:id1 id3,id0,id4,id2id2 id0,id5整个计算过程分为4步1、提取原始日志日期,cookie id,商品id信息,按天计算,最后输出数据格式商品id-0 商品id-1xx x x这一步做了次优化,商品id-0一定比商品id-1小,为了减少存储,在最后汇总数据转置下即可reduce做局部排序及排重2、基于上次的结果做汇总,按天计算商品id-0 商品id-1 关联值(关联值即同时访问这两个商品的用户数)xx x x xx3、汇总最近三个月数据,同时考虑时间衰减,时间越久关联值的贡献越低,最后输出两两商品的关联值(包括转置后)4、行列转换,生成最后要的推荐结果数据,按关联值排序生成第一个MR[java]import java.io.IOException;import java.util.ArrayList;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FileSystem;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.io.WritableComparable;import org.apache.hadoop.io.WritableComparator;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Partitioner;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.util.GenericOptionsParser;import org.apache.log4j.Logger;/** 输入:原始数据,会有重复*日期 cookie 楼盘id** 输出:* 日期 楼盘id1 楼盘id2 //楼盘id1一定小于楼盘id2 ,按日期 cookie进行分组**/public class HouseMergeAndSplit {public static class Partitioner1 extends Partitioner<TextPair, Text> {@Overridepublic int getPartition(TextPair key, Text value, int numParititon) {return Math.abs((new Text(key.getFirst().toString()+key.getSecond().toString())).hashCode() * 127) % numParititon;}}public static class Comp1 extends WritableComparator {public Comp1() {super(TextPair.class, true);}@SuppressWarnings("unchecked")public int compare(WritableComparable a, WritableComparable b) {TextPair t1 = (TextPair) a;TextPair t2 = (TextPair) b;int comp= t1.getFirst().compareTo(t2.getFirst());if (comp!=0)return comp;return t1.getSecond().compareTo(t2.getSecond());}}public static class TokenizerMapperextends Mapper<LongWritable, Text, TextPair, Text>{Text val=new Text("test");public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {String s[]=value.toString().split("\001");TextPair tp=new TextPair(s[0],s[1],s[4]+s[3]); //thedate cookie city+houseidcontext.write(tp, val);}}public static class IntSumReducerextends Reducer<TextPair,Text,Text,Text> {private static String comparedColumn[] = new String[3];ArrayList<String> houselist= new ArrayList<String>();private static Text keyv = new Text();private static Text valuev = new Text();static Logger logger = Logger.getLogger(HouseMergeAndSplit.class.getName());public void reduce(TextPair key, Iterable<Text> values,Context context) throws IOException, InterruptedException {houselist.clear();String thedate=key.getFirst().toString();String cookie=key.getSecond().toString();for (int i=0;i<3;i++)comparedColumn[i]="";&n补充:软件开发 , Java ,
上一个:常用排序算法总结(三)----选择排序 堆排序
下一个:volatile
- 更多JAVA疑问解答:
- java怎么在线读取ftp服务器上的文件内容
- 关于程序员的职业规划
- HTML和JSP矛盾吗?
- java小程序如何打包?
- java怎么split路径文件名?
- 关于Hibernate实体自身多对一的抓取问题
- 关于apache2+tomcat群集出现的问题
- SSH 导入导出excel 谁有这块的资料吗?
- springmvc 加载一个jsp页面执行多个方法 报404
- 关于用jquery 导入 excel
- java对时间进行循环放到List中
- 一个图片的输入输出程序,第一次调用某方法会中断,第二次调用则正常
- 请上过传智播客的人说一下传智播客怎么样呀!是不是像它说的那样好呀!
- spring的schema怎么配置
- 【菜鸟求助】SSH中怎么从JSP页面往后台传值呢