1. 程式人生 > >hadoop2.5.2學習14--MR之協同過濾天貓推薦演算法實現01

hadoop2.5.2學習14--MR之協同過濾天貓推薦演算法實現01

一、程式碼步驟:


1、 去重
2、 獲取所有使用者的喜歡矩陣:
這裡寫圖片描述
3、 獲得所有物品之間的同現矩陣
4、 兩個矩陣相乘得到三維矩陣
5、 三維矩陣的資料相加獲得所有使用者對所有物品的推薦值(二維矩陣)
6、 按照推薦值降序排序。

二、程式碼實現

2.1、第一個mapreduce, 實現去重


由於原始資料可能有還壞資料,我們需要進行去重。
第一個mapreduce實現去重
這個非常簡單, 將每行資料最為map的key
洗牌階段(shuffle) 會進行分組, 預設key相同的分到一組, 有多個value
但是我們在reducer中輸出key, 就保證了去重

package com.chb.catTest;

import java.io.IOException;
import java.util.Map;

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.NullWritable;
import org.apache.hadoop
.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /** *第一個mapreduce實現去重 *這個非常簡單, 將每行資料最為map的key *洗牌階段(shuffle) 會進行分組, 預設key相同的分到一組, 有多個value *但是我們在reducer中輸出key, 就保證了去重 * */
public class Step1 { public static boolean run(Configuration conf, Map<String, String> paths) throws Exception { FileSystem fs = FileSystem.get(conf); Job job = Job.getInstance(); job.setJar(""); job.setJarByClass(Step1.class); job.setJobName("Step1"); job.setMapperClass(step1Mapper.class); job.setReducerClass(step1Reducer.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(NullWritable.class); FileInputFormat.addInputPath(job, new Path(paths.get("step1Input"))); Path out = new Path(paths.get("step1Output")); if (fs.exists(out)) { fs.delete(out, true); } FileOutputFormat.setOutputPath(job, out); boolean f = job.waitForCompletion(true); return f; } static class step1Mapper extends Mapper<LongWritable, Text, Text, NullWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { if (key.get() != 0) { context.write(value, NullWritable.get()); } } } static class step1Reducer extends Reducer<Text, NullWritable, Text, NullWritable>{ @Override protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { //直接輸出key context.write(key, NullWritable.get()); } } }

2.2 第二個mapreduce 計算每個使用者對每種商品的喜愛得分

按照每個使用者分組, 對第一個mapreduce去重之後的資料進行統計,
只需要對每行資料提取使用者:item, 操作,
為了簡化, 將使用者的每種操作設定固定的喜愛得分

    /**
     * 根據使用者對商品的操作, 
     * 設定對商品的喜愛度。
     */
    public static Map<String, Integer> R = new HashMap<String, Integer>();
    static {
        R.put("click", 1);   //點選
        R.put("collect", 2); //收藏
        R.put("cart", 3);    //加入購物籃
        R.put("alipay", 4);  //付款
    }

在第二個的mapreduce中的Mapper中對每行資料處理,輸出
user_id item_id1:評分

            Integer rv = RunJob.R.get(action);
            context.write(new Text(user_id), new Text(item_id+":"+rv.intValue()));
            //user_id     item_id1:評分 

在reduce中,

因為key為使用者,在shuffle中,預設分組按照key是否相同,
所以只需要對每個使用者對同一物品的喜愛得分合並即可

            //一個使用者分一個組,首先對同意物品的喜愛得分進行合併
            Map<String, Integer>  maps = new HashMap<String, Integer>();
            for (Text text : values) {
                String[] vs = text.toString().split(":");
                String item_id = vs[0];
                int action = Integer.parseInt(vs[1]);
                if (maps.get(item_id) == null) {
                    maps.put(item_id, action);
                }else {
                    int av = maps.get(item_id);
                    av += action;
                    maps.put(item_id, av);
                }
            }

然後輸出同一使用者的不同物品的喜愛得分,

以逗號分割不用物品的喜愛得分

            StringBuffer sb = new StringBuffer();
            //輸出每個使用者對每個產品的喜愛得分 輸出到value, 以item_id:喜愛得分 追加, 以逗號分隔不同物品的喜愛得分情況
            Set<String> keySet = maps.keySet();
            for (Iterator<String> iterator = keySet.iterator(); iterator.hasNext();) {
                String item_id =  iterator.next();
                int action = maps.get(item_id);
                sb.append(item_id+":"+action+",");
            }
            context.write(key, new Text(sb.toString()));

輸出結果如下:

u2722   i105:1,i79:2,i471:1,i489:1,i203:2,i485:1,i258:1,i63:2,i254:4,i444:1,i159:1,i283:3,i161:11,i175:1,i149:2,i335:3,i528:1,i36:2,i230:1,
u2723   i429:1,i87:2,i561:1,i427:2,i428:2,i364:3,i362:1,i83:1,i84:1,i562:1,i86:1,i130:1,i234:1,i236:2,i237:5,i239:1,i137:1,i421:1,i139:1,i134:1,i230:1,i490:1,i359:1,i79:1,i358:1,i550:3,i419:1,i77:1,i354:1,i9:3,i492:1,i71:1,i557:1,i74:1,i75:2,i72:1,i142:4,i143:1,i246:1,i8:1,i149:1,i241:1,i2:2,i145:1,i1:2,i119:1,i388:1,i407:1,i309:1,i383:1,i488:1,i29:1,i384:1,i27:1,i258:1,i25:1,i26:1,i254:1,i304:1,i303:1,i111:1,i250:1,i116:2,i118:1,i198:2,i376:1,i471:1,i194:1,i379:1,i476:1,i90:1,i371:1,i14:1,i266:5,i124:1,i263:1,i122:1,i262:1,i126:1,i524:1,i328:1,i273:1,i469:1,i178:1,i40:1,i274:1,i179:1,i46:2,i173:3,i327:2,i279:1,i175:2,i323:1,i172:2,i171:1,i321:1,i501:1,i514:1,i502:2,i106:1,i394:1,i101:1,i392:4,i102:1,i202:1,i203:2,i397:1,i282:1,i208:1,i281:5,i455:4,i458:2,i31:1,i283:1,i313:1,i33:1,i519:2,i185:1,i515:1,i109:3,i310:1,i517:1,i39:4,i506:1,i213:1,i295:1,i155:1,i157:1,i446:30,i60:1,i290:1,i344:1,i548:2,i342:2,i343:1,i348:1,i299:1,i152:1,i298:1,i534:1,i535:2,i225:1,i228:2,i227:1,i169:1,i435:2,i167:1,i53:13,i166:1,i433:1,i538:1,i160:1,i334:1,i335:2,i57:1,i163:1,
u2724   i429:2,i428:2,i366:1,i362:1,i83:1,i84:1,i237:1,i420:1,i425:1,i79:1,i77:1,i550:1,i419:2,i495:1,i9:2,i70:1,i496:1,i551:1,i142:1,i143:1,i144:1,i1:1,i240:1,i386:1,i409:1,i484:1,i406:2,i309:1,i381:1,i383:3,i488:1,i487:2,i27:1,i258:3,i28:1,i26:1,i254:1,i304:1,i257:1,i117:1,i472:1,i375:1,i194:1,i19:1,i474:1,i120:1,i121:1,i266:1,i125:1,i524:1,i523:1,i464:1,i41:1,i40:1,i46:2,i173:3,i44:1,i324:2,i43:1,i528:1,i461:1,i172:1,i320:1,i105:1,i190:1,i107:1,i394:2,i391:4,i392:6,i203:1,i206:1,i208:1,i281:2,i455:2,i285:1,i459:1,i314:1,i316:1,i183:1,i504:1,i517:1,i547:2,i214:11,i212:1,i448:1,i297:2,i445:1,i446:22,i60:2,i291:1,i442:1,i344:1,i345:1,i348:1,i152:1,i67:1,i66:1,i536:1,i535:1,i221:1,i223:1,i51:1,i53:7,i430:1,i160:1,i334:2,i165:1,i54:1,i56:1,
u2725   i281:1,i446:1,i77:1,i12:1,i192:1,i72:1,
u2726   i525:1,i542:1,i540:1,i483:1,i521:1,i385:1,i86:1,i300:1,i445:1,i446:1,i178:1,i291:1,i304:1,i293:1,i442:1,i421:1,i176:1,i342:1,i324:1,i549:1,i278:1,i348:1,i115:1,i151:1,i230:1,i153:1,i79:1,i394:1,i534:1,i353:1,i535:1,i192:2,i390:1,i352:1,i94:1,i479:1,i73:1,i435:1,i140:1,i52:1,i455:1,i559:1,i263:1,i313:1,i160:1,i334:1,i518:1,
u2727   i446:3,i468:2,
u2728   i502:1,i364:1,i194:2,i536:1,i191:1,i9:1,i192:1,i360:1,i280:1,i446:1,i455:2,i229:1,i431:1,i40:1,i247:1,i331:1,i250:1,i313:1,i160:1,i114:1,i151:1,

相關推薦

hadoop2.5.2學習14--MR協同過濾推薦演算法實現01

一、程式碼步驟: 1、 去重 2、 獲取所有使用者的喜歡矩陣: 3、 獲得所有物品之間的同現矩陣 4、 兩個矩陣相乘得到三維矩陣 5、 三維矩陣的資料相加獲得所有使用者對所有物品的推薦值(二維矩陣) 6、 按照推薦值降序排序。

推薦系統協同過濾(CF)演算法

一,集體智慧(社會計算): 集體智慧 (Collective Intelligence) 並不是 Web2.0 時代特有的,只是在Web2.0 時代,大家在 Web 應用中,利用集體智慧構建了更加有趣的應用或者得到更好的使用者體驗。集體智慧是指在大量

python資料分析:基於協同過濾的電影推薦演算法

協同過濾 協同過濾(英語:Collaborative Filtering),簡單來說是利用某興趣相投、擁有共同經驗之群體的喜好來推薦使用者感興趣的資訊,個人透過合作的機制給予資訊相當程度的迴應(如評分)並記錄下來以達到過濾的目的進而幫助別人篩選資訊,迴應不一定侷限於特別感興趣的,特別

Hadoop——CentOS + hadoop2.5.2分散式環境配置

一、基礎環境準備 系統:(VMWare) CentOS-6.5-x86_64-bin-DVD1.iso hadoop版本:hadoop-2.5.2 jdk版本:jdk-7u72-linux-x64.tar.gz 1.叢集機器 三臺測試叢集,一個master(liuyazh

Hadoop——Hadoop2.5.2 HA高可靠性叢集搭建(Hadoop+Zookeeper)前期準備

今天是十一長假的第三天,節前,很多朋友發來私信說,網上基於HA的Hadoop叢集,動不動就是7、8臺伺服器,甚至是10幾臺伺服器,自己的電腦Hold不住這麼多虛擬機器啊!有什麼辦法可以將伺服器縮減為3臺嗎?今天,我就為大家帶來一篇如何在3臺CentOS 虛擬機器上搭建基於

Hadoop——Hadoop2.5.2 HA高可靠性叢集搭建(Hadoop+Zookeeper)

一、Hadoop(HA)叢集的規劃 叢集規劃 主機名 IP NameNode DataNode Yarn ZooKeeper JournalNode liuyazhuang145 192.168.0.145 是 是 否 是 是 liuyazhuang146 192.16

Hadoop2.5.2叢集部署(完全分散式)

環境介紹 硬體環境 CPU 4 MEM 4G 磁碟 60G  軟體環境 OS:centos6.5版本 64位 Hadoop:hadoop2.5.2 64位 JDK: JDK 1.8.0_91 主機配

Hadoop2.5.2集群部署(完全分布式)

tex 免密碼登錄 文件復制 job src 時間 配置環境 8.0 上進 環境介紹 硬件環境 CPU 4 MEM 4G 磁盤 60G 軟件環境 OS:centos6.5版本 64位 Hadoop:hadoop2.5.2 64位 JDK: JDK 1.8.0_91 主機

[機器學習]推薦系統協同過濾演算法

在現今的推薦技術和演算法中,最被大家廣泛認可和採用的就是基於協同過濾的推薦方法。本文將帶你深入瞭解協同過濾的祕密。下面直接進入正題. 1. 什麼是推薦演算法 推薦演算法最早在1992年就提出來了,但是火起來實際上是最近這些年的事情,因為網際網路的爆發,有了更大的資料量可以供我們使用,推薦演算法才有了很大的用武

教你Windows平臺安裝配置Hadoop2.5.2(不借助cygwin)

剛入門hadoop,開發環境的搭建估計能把一部分人逼走。我也差點瘋了。 估計能看到這篇文章的小夥伴們都飽受cygwin和各種配置檔案的折磨了吧? 如果你不想在linux上搭建,又不想安裝cygwin。那就繼續往下看啦~ 一、 安裝hadoop2

大資料 hadoop2.5.2偽分散式搭建

1.準備Linux環境     1.0點選VMware快捷方式,右鍵開啟檔案所在位置 -> 雙擊vmnetcfg.exe -> VMnet1 host-only ->修改subnet ip 設定網段:192.168.8.0 子網掩碼:255.255.255.0 -> apply -&g

Hadoop2.5.2+ubuntu14.04+eclispe+hadoop2x-eclipse-plugin-master搭建開發環境

Hadoop2.5.2+ubuntu14.04+eclispe(Version:Luna Service Release 2 (4.4.2))+hadoop2x-eclipse-plugin-master搭建開發環境 環境: ubuntu14.04(或者linux系

hadoop2.8.2官方文件分散式叢集

目標 這個文件介紹怎麼使用Hadoop叢集,從幾個節點到幾千個節點。想要玩轉Hadoop,你可能需要先嚐試一下單節點模式:see(單節點模式) 這個文件不包括一些高階主題,比如:安全性和高可用性。 需求 安裝java正確版本。(單節點模式中介紹瞭如

5.2、聚類層次聚類例項

例項二、各省消費資料 #1、載入資料 X<-data.frame( x1=c(2959.19, 2459.77, 1495.63, 1046.33, 1303.97, 1730.84, 1561.86, 1410.11, 3712.31, 2207.58, 2629.16, 184

整合Nutch2.3.1/Hadoop2.5.2/Hbase1.1.5/Solr4.10.4構建搜尋引擎:安裝及執行

第一次寫部落格,之前從來沒有寫過部落格因為不知道要寫什麼,這次寫部落格是因為自己在學習東西的時候遇見很多問題,國內的技術資料基本都是比較老的,要不就是nutch2.x整合hadoop1.x的,沒有找到整合hadoop2.x的,對hbase的整合度也很少,自己在學習的時候,

回溯法-5.5.2 n皇后問題迭代法

n皇后問題的解空間有n^n個解,演算法的目的是從所有解中找出可行解的個數。 非遞迴演算法實現步驟 在當前第k行下找出可以放置皇后的列座標 –if(找到的列座標小於n){ —- if(已經到最

虛擬機器下Linux系統Hadoop單機/偽分散式配置:Hadoop2.5.2+Ubuntu14.04(半原創)

系統: Ubuntu 14.04 64bitHadoop版本: Hadoop 2.5.2 (stable)JDK版本: JDK 1.6 虛擬機器及Ubuntu安裝 1. 下載並安裝 VMware workstation 11   下載地址:https://my.vmwar

linux(centos7)基於hadoop2.5.2安裝spark1.2.1

1、安裝hadoop參考 2、安裝scala參考 3、安裝spark 下載spark最新版spark-1.2.1-bin-hadoop2.4.tgz 上傳到linux上/opt下面,解壓 [root@master opt]# tar -zxf spark-1.2.1

推薦系統學習(一)——協同過濾

一、協同過濾推薦演算法的原理及實現 見連結詳細介紹 https://blog.csdn.net/yimingsilence/article/details/54934302 1.基於使用者的協同過濾 如上述連結例題未看懂看此例題: 2.基於專案的協同過濾 二、協同

Python協同過濾(尋找相近的使用者)

資料內容是人們對不同電影的評價:我們通過計算人與人之間評價電影的相關度來找到口味相同的人,根據口味相同的人來推薦可能喜歡的電影。 資料如下: critics={'lisa rose':{'lady in the Water':2.5,'snakes