大数据挖掘工具资料收集之RhadoopV1.0

更新时间:2023-05-22 09:50:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

1 基本介绍

1.1 简介

RHadoop是运行R语言的Hadoop分布式计算平台的简称。要认识Rhadoop首先我们分别来认识R语言和Hadoop。

Hadoop已经成名好多年了,它是Apache软件基金会旗下的一个JAVA开源分布式计算平台,现已被各大互联网企业(包括Yahoo和Facebook等)用于大规模数据分布式存储与分布式计算。近年来随着云计算、大数据处理、数据挖掘等概念和应用越来越火,Hadoop更是名声大噪,各大企业对熟悉Hadoop体系架构和性能优化的人才需求也相当旺盛,人才缺口也相对加大。

R语言可能对大多数人来说比较陌生,但是做数理统计、数据分析的人不会不知道R。R是一门主要运用于统计分析与绘图的编程语言和操作工具。和Matlab类似,R是一门高级脚本化编程语言,直接在命令行输入指令即可运行,无需编译链接。它可以进行高效的向量化运算,效率远高于传统的循环运算。另外,R是开源的,有大批杰出的工程师和程序员为R开发了许多好用的函数库和图形化工具,尤其在数理统计方面有大量成熟的开源的程序包。所以R是做数据挖掘、数据分析的廉价高效的方案。

1.2 功能

Rhadoop是将R的强大统计分析能力和hadoop的大数据处理能力相结合,可由以下几项功能组成。

R内置多种统计学及数字分析功能

R的另一强项是绘图功能,制图具有印刷的素质,也可加入数学符号 Hadoop分布式文件系统,高吞吐量的数据级别达到TB、PB甚至EB Mapreduce高效并行计算

1.3 常用算法包

Rhadoop中的数据挖掘算法均来自R语言(或者说R软件),常用算法包如下:

1.3.1 聚类

常用的包: fpc,cluster,pvclust,mclust 基于划分的方法: kmeans, pam, pamk, clara

基于层次的方法: hclust, pvclust, agnes, diana 基于模型的方法: mclust 基于密度的方法: dbscan

基于画图的方法: plotcluster, plot.hclust

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

基于验证的方法: cluster.stats

1.3.2 分类

常用的包:

rpart,party,randomForest,rpartOrdinal,tree,marginTree, maptree,survival 决策树: rpart, ctree

随机森林: cforest, randomForest

回归, Logistic回归, Poisson回归: glm, predict, residuals 生存分析: survfit, survdiff, coxph

1.3.3 关联规则与频繁项集

常用的包:

arules:支持挖掘频繁项集,最大频繁项集,频繁闭项目集和关联规则 DRM:回归和分类数据的重复关联模型

APRIORI算法,广度RST算法:apriori, drm

ECLAT算法: 采用等价类,RST深度搜索和集合的交集: eclat

1.3.4 序列模式

常用的包: arulesSequences SPADE算法: cSPADE

1.3.5 时间序列

常用的包: timsac 时间序列构建函数: ts

成分分解: decomp, decompose, stl, tsr

1.3.6 人工神经网络

nnet

1.3.7 支持向量机

e1071

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

1.3.8 统计

常用的包: Base R, nlme 方差分析: aov, anova 密度分析: density

假设检验: t.test, prop.test, anova, aov 线性混合模型:lme

主成分分析和因子分析:princomp

1.3.9 接入数据挖掘软件Weka算法包

RWeka: 通过这个接口,可以在R中使用Weka的所有算法。

2 系统架构

RHadoop是R环境+hadoop环境,是实际上是在hadoop集群中安装了R环境,通过R的三个包rmr、rhdfs、rhbase(分别是对应Hadoop系统架构中的,MapReduce, HDFS, HBase 三个部分),实现R对hadoop各个组件的调用,从而将R与hadoop平台结合,从而充分利用了R和hadoop各自的优势。Hadoop主要用来存储海量数据,R语言完成MapReduce 算法,用来替代Java的MapReduce实现,将R丰富的算法模型赋予分布式并行计算能力。

3 适用场景

Hadoop有海量数据存储能力和高效并行计算框架,但缺乏数据统计和建模能力,R语言可以为hadoop注入统计血脉,增强hadoop集群的数据统计分析和建模能力,R+Hadoop将实现高效的海量数据分析与挖掘技术。虽然hadoop软件家族中的mahout也可以实现机器学习算法的并行计算,但mahout的算法模型还是较少和不够成熟,并且本身是一个算法库,它缺少R语言(或者说R软件)的数据统计分析以及绘图能力,因而Rhadoop相比mahout有诸多优势。

4 优缺点分析

4.1 优缺点概览

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

4.2 主要优缺点说明

所以如果让能R运行在Hadoop平台上可以说是如虎添翼,可以让数据分析人员,即能用到R丰富的程序包,又能借助Hadoop分布式运算、分布式存储的优势做海量数据的处理。但由于R+Hadoop还不够成熟,企业级应用依然缺乏成功案例,

所以当实施R+Hadoop的应用时,还会碰到非常多的问题。

5 扩展性

Hadoop的高扩展性和R语言的高扩展性决定rhadoop的高扩展性

6 实际案例

6.1 简单示例(WordCount的例子)

使用rmr包和rhdfs包做个WordCount的试验。 首先要启动Hadoop。 system('start-all.sh')

system('hadoop dfsadmin -safemode leave') 加载R包。 require(rmr) require(rhdfs)

rhdfs包会建议做一个初始化测试。

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

hdfs.init()

编写wordcount函数。

wordcount <- function (input, output=NULL, split='[[:punct:][:space:]]+'){

mapreduce(input=input, output=output, map=function(k, v){

v2=unlist(strsplit(x=v, split=split)) v3=v2[v2!=' ']

lapply(v3, function(w){keyval(w, 1)}) },

reduce=function(k, vv){ keyval(k, sum(unlist(vv))) }) }

直接输入文本,转成HDFS文件,计数。 lines <- c('this is just a joke,', 'and that is just another joke,', 'we all like them very much,', 'because they are so funny.') lines_dfs <- to.dfs(lines)

wc1 <- wordcount(input=lines_dfs)

data.frame(do.call(rbind, from.dfs(wc1))) key val 1 a 1 2 is 2 3 so 1 4 we 1 5 all 1 6 and 1 7 are 1 8 joke 2 9 just 2 10 like 1 11 much 1 12 that 1 13 them 1 14 they 1 15 this 1 16 very 1 17 funny 1 18 another 1 19 because 1

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

6.2 R实现MapReduce的协同过滤算法

1.基于物品推荐的协同过滤算法介绍 2.R本地程序实现

3.R基于Hadoop分步式程序实现

每一章节,都会分为”文字说明部分”和”代码部分”,保持文字说明与代码的连贯性。

6.2.1 基于物品推荐的协同过滤算法介绍

文字说明部分:

越来越多的互联网应用,都开始使用推荐算法(协同过滤算法)。根据用户活跃度和物品流行度,可以分为”基于用户的协同过滤算法”和”基于物品的协同过滤算法”。

基于用户的协同过滤算法,是给用户推荐和他兴趣相似的其他用户喜欢的物品。 基于物品的协同过滤算法,是给用户推荐和他之前喜欢的物品相似的物品。

基于物品的协同过滤算法,是目前广泛使用的一种推荐算法,像Netflix, YouTube, Amazon等。 算法主要分为两步: 1. 计算物品之间的相似度

2. 根据物品的相似度和用户的历史行为给用户生成推荐列表

有关算法的细节请参考:”Mahout In Action”和”推荐系统实践”两本书。 为开发方便,我们选择一组很小的测试数据集。 测试数据,来自于”Mahout In Action” P49 原第8行,3,101,2.5 改为 3,101,2.0

每行3个字段,依次是用户ID,物品ID,对物品的评分

代码部分:

在服务上创建测试数据文件small.csv

~ pwd

/root/R

~ vi small.csv

1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

3,101,2.0 3,104,4.0 3,105,4.5 3,107,5.0 4,101,5.0 4,103,3.0 4,104,4.5 4,106,4.0 5,101,4.0 5,102,3.0 5,103,2.0 5,104,4.0 5,105,3.5 5,106,4.0 ~ ls

small.csv

6.2.2 R本地程序实现

首先,通过R语言实现基于物品的协同过滤算法,为和RHadoop实现进行对比。这里我使用”Mahout In Action”书里,第一章第六节介绍的分步式基于物品的协同过滤算法进行实现。Chapter 6: Distributing recommendation computations 算法的思想:

1. 建立物品的同现矩阵 2. 建立用户对物品的评分矩阵 3. 矩阵计算推荐结果

文字说明部分:

1. 建立物品的同现矩阵

按用户分组,找到每个用户所选的物品,单独出现计数,及两两一组计数。 例如:用户ID为3的用户,分别给101,104,105,107,这4个物品打分。 1) (101,101),(104,104),(105,105),(107,107),单独出现计算各加1。

2) (101,104),(101,105),(101,107),(104,105),(104,107),(105,107),两个一组计数各加1。 3) 把所有用户的计算结果求和,生成一个三角矩阵,再补全三角矩阵,就建立了物品的同现矩阵。

如下面矩阵所示:

[101] [102] [103] [104] [105] [106] [107] [101] 5 3 4 4 2 2 1

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

[102] 3 3 3 2 1 1 0 [103] 4 3 4 3 1 2 0

[104] 4 2 3 4 2 2 1 [105] 2 1 1 2 2 1 1 [106] 2 1 2 2 1 2 0 [107] 1 0 0 1 1 0 1

2. 建立用户对物品的评分矩阵

按用户分组,找到每个用户所选的物品及评分

例如:用户ID为3的用户,分别给(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0),这4个物品打分。

1) 找到物品评分(3,101,2.0),(3,104,4.0),(3,105,4.5),(3,107,5.0) 2) 建立用户对物品的评分矩阵

U3 [101] 2.0 [102] 0.0 [103] 0.0 [104] 4.0 [105] 4.5 [106] 0.0 [107] 5.0

3. 矩阵计算推荐结果 同现矩阵*评分矩阵=推荐结果

推荐给用户ID为3的用户的结果是(103,24.5),(102,18.5),(106,16.5) 代码部分:

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

#引用plyr包 library(plyr)

#读取数据集

train<-read.csv(file="small.csv",header=FALSE) names(train)<-c("user","item","pref")

> train

user item pref 1 1 101 5.0 2 1 102 3.0 3 1 103 2.5 4 2 101 2.0 5 2 102 2.5 6 2 103 5.0 7 2 104 2.0 8 3 101 2.0 9 3 104 4.0 10 3 105 4.5 11 3 107 5.0 12 4 101 5.0 13 4 103 3.0 14 4 104 4.5 15 4 106 4.0 16 5 101 4.0 17 5 102 3.0 18 5 103 2.0 19 5 104 4.0 20 5 105 3.5 21 5 106 4.0

#计算用户列表

usersUnique<-function(){ users<-unique(train$user) users[order(users)] }

#计算商品列表方法

itemsUnique<-function(){ items<-unique(train$item) items[order(items)] }

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

# 用户列表

users<-usersUnique() > users [1] 1 2 3 4 5

# 商品列表

items<-itemsUnique() > items

[1] 101 102 103 104 105 106 107

#建立商品列表索引

index<-function(x) which(items %in% x)

data<-ddply(train,.(user,item,pref),summarize,idx=index(item)) > data

user item pref idx 1 1 101 5.0 1 2 1 102 3.0 2 3 1 103 2.5 3 4 2 101 2.0 1 5 2 102 2.5 2 6 2 103 5.0 3 7 2 104 2.0 4 8 3 101 2.0 1 9 3 104 4.0 4 10 3 105 4.5 5 11 3 107 5.0 7 12 4 101 5.0 1 13 4 103 3.0 3 14 4 104 4.5 4 15 4 106 4.0 6 16 5 101 4.0 1 17 5 102 3.0 2 18 5 103 2.0 3 19 5 104 4.0 4 20 5 105 3.5 5 21 5 106 4.0 6

#同现矩阵

cooccurrence<-function(data){ n<-length(items)

co<-matrix(rep(0,n*n),nrow=n) for(u in users){

idx<-index(data$item[which(data$user==u)])

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

m<-merge(idx,idx) for(i in 1:nrow(m)){

co[m$x[i],m$y[i]]=co[m$x[i],m$y[i]]+1 } }

return(co) }

#推荐算法

recommend<-function(udata=udata,co=coMatrix,num=0){ n<-length(items)

# all of pref pref<-rep(0,n)

pref[udata$idx]<-udata$pref

# 用户评分矩阵

userx<-matrix(pref,nrow=n)

# 同现矩阵*评分矩阵 r<-co %*% userx

# 推荐结果排序 r[udata$idx]<-0

idx<-order(r,decreasing=TRUE)

topn<-data.frame(user=rep(udata$user[1],length(idx)),item=items[idx],val=r[idx]) topn<-topn[which(topn$val>0),]

# 推荐结果取前num个 if(num>0){

topn<-head(topn,num) }

#返回结果 return(topn) }

#生成同现矩阵

co<-cooccurrence(data) > co

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] 5 3 4 4 2 2 1 [2,] 3 3 3 2 1 1 0

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

[3,] 4 3 4 3 1 2 0 [4,] 4 2 3 4 2 2 1 [5,] 2 1 1 2 2 1 1 [6,] 2 1 2 2 1 2 0 [7,] 1 0 0 1 1 0 1

#计算推荐结果

recommendation<-data.frame() for(i in 1:length(users)){

udata<-data[which(data$user==users[i]),]

recommendation<-rbind(recommendation,recommend(udata,co,0)) }

> recommendation user item val 1 1 104 33.5 2 1 106 18.0 3 1 105 15.5 4 1 107 5.0 5 2 106 20.5 6 2 105 15.5 7 2 107 4.0 8 3 103 24.5 9 3 102 18.5 10 3 106 16.5 11 4 102 37.0 12 4 105 26.0 13 4 107 9.5 14 5 107 11.5

6.2.3 R基于Hadoop分步式程序实现

R语言实现的MapReduce算法,可以基于R的数据对象实现,不必如JAVA一样使用文本存储。

算法思想同上面R语言实现思想,略有复杂。 算法的思想:

1. 建立物品的同现矩阵

1) 按用户分组,得到所有物品出现的组合列表。 2) 对物品组合列表进行计数,建立物品的同现矩阵 2. 建立用户对物品的评分矩阵 3. 合并同现矩阵和评分矩阵

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

4. 计算推荐结果列表

5. 按输入格式得到推荐评分列表

通过MapReduce实现时,所有操作都要使用Map和Reduce的任务完成,程序实现过程略有变化。

文字说明部分:

1. 建立物品的同现矩阵

1) 按用户分组,得到所有物品出现的组合列表。 key:物品列表向量 val:物品组合向量

$key

[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102 [20] 102 102 102 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104 [39] 104 104 104 104 104 104 104 105 105 105 105 106 106 106 106 107 107 107 107

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

[58] 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104 [77] 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106 $val

[1] 101 102 103 101 102 103 104 101 104 105 107 101 103 104 106 101 102 103 101 [20] 102 103 104 101 102 103 101 102 103 104 101 103 104 106 101 102 103 104 101 [39] 104 105 107 101 103 104 106 101 104 105 107 101 103 104 106 101 104 105 107 [58] 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 101 [77] 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106

2) 对物品组合列表进行计数,建立物品的同现矩阵 key:物品列表向量

val:同现矩阵的数据框值(item,item,Freq)

矩阵格式,要与”2. 建立用户对物品的评分矩阵”的格式一致,把异构的两种数据源,合并为同一种数据格式,为”3. 合并同现矩阵和评分矩阵”做数据基础。

$key

[1] 101 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 [20] 104 104 104 104 104 104 104 105 105 105 105 105 105 105 106 106 106 106 106 [39] 106 107 107 107 107 $val k v freq 1 101 101 5 2 101 102 3 3 101 103 4 4 101 104 4 5 101 105 2 6 101 106 2 7 101 107 1 8 102 101 3 9 102 102 3 10 102 103 3 11 102 104 2 12 102 105 1 13 102 106 1 14 103 101 4 15 103 102 3 16 103 103 4 17 103 104 3 18 103 105 1 19 103 106 2 20 104 101 4 21 104 102 2

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

23 104 104 4 24 104 105 2 25 104 106 2 26 104 107 1 27 105 101 2 28 105 102 1 29 105 103 1 30 105 104 2 31 105 105 2 32 105 106 1 33 105 107 1 34 106 101 2 35 106 102 1 36 106 103 2 37 106 104 2 38 106 105 1 39 106 106 2 40 107 101 1 41 107 104 1 42 107 105 1 43 107 107 1

2. 建立用户对物品的评分矩阵 key:物品列表

val:用户对物品打分矩阵

矩阵格式,要与”2) 对物品组合列表进行计数,建立物品的同现矩阵”的格式一致,把异构的两种数据源,合并为同一种数据格式,为”3. 合并同现矩阵和评分矩阵”做数据基础

$key

[1] 101 101 101 101 101 102 102 102 103 103 103 103 104 104 104 104 105 105 106 [20] 106 107 $val

item user pref 1 101 1 5.0 2 101 2 2.0 3 101 3 2.0 4 101 4 5.0 5 101 5 4.0 6 102 1 3.0 7 102 2 2.5 8 102 5 3.0 9 103 1 2.5

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

11 103 4 3.0 12 103 5 2.0 13 104 2 2.0 14 104 3 4.0 15 104 4 4.5 16 104 5 4.0 17 105 3 4.5 18 105 5 3.5 19 106 4 4.0 20 106 5 4.0 21 107 3 5.0

3. 合并同现矩阵和评分矩阵

这一步操作是MapReduce比较特殊的,因为数据源是两个异构数据源,进行MapReduce的操作。

在之前,我们已经把两种格式合并为一样的。使用equijoin这个rmr2包的函数,进行矩阵合并。 key:NULL val:合并的数据框

$key NULL $val

k.l v.l freq.l item.r user.r pref.r 1 103 101 4 103 1 2.5 2 103 102 3 103 1 2.5 3 103 103 4 103 1 2.5 4 103 104 3 103 1 2.5 5 103 105 1 103 1 2.5 6 103 106 2 103 1 2.5 7 103 101 4 103 2 5.0 8 103 102 3 103 2 5.0 9 103 103 4 103 2 5.0 10 103 104 3 103 2 5.0 11 103 105 1 103 2 5.0 12 103 106 2 103 2 5.0 13 103 101 4 103 4 3.0 ....

4. 计算推荐结果列表

把第三步中的矩阵,进行合并计算,得到推荐结果列表 key:物品列表 val:推荐结果数据框

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

$key

[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 [19] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 [37] 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 102 103 [55] 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 103 [73] 103 103 103 103 103 104 104 104 104 104 104 104 104 104 104 104 104 104 [91] 104 104 104 104 104 104 104 104 104 104 104 104 104 104 104 105 105 105 [109] 105 105 105 105 105 105 105 105 105 105 105 106 106 106 106 106 106 106 [127] 106 106 106 106 106 107 107 107 107 $val

k.l v.l user.r v 1 101 101 1 25.0 2 101 101 2 10.0 3 101 101 3 10.0 4 101 101 4 25.0 5 101 101 5 20.0 6 101 102 1 15.0 7 101 102 2 6.0 8 101 102 3 6.0 9 101 102 4 15.0 10 101 102 5 12.0 11 101 103 1 20.0 12 101 103 2 8.0 13 101 103 3 8.0 14 101 103 4 20.0 15 101 103 5 16.0 16 101 104 1 20.0 17 101 104 2 8.0 18 101 104 3 8.0 ....

5. 按输入格式得到推荐评分列表

对推荐结果列表,进行排序处理,输出排序后的推荐结果。 key:用户ID val:推荐结果数据框

$key

[1] 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 4 4 5 5 5 5 5 5 5 $val

user item pref 1 1 101 44.0

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

2 1 103 39.0 3 1 104 33.5 4 1 102 31.5 5 1 106 18.0 6 1 105 15.5 7 1 107 5.0 8 2 101 45.5 9 2 103 41.5 10 2 104 36.0 11 2 102 32.5 12 2 106 20.5 13 2 105 15.5 14 2 107 4.0 15 3 101 40.0 16 3 104 38.0 17 3 105 26.0 18 3 103 24.5 19 3 102 18.5 20 3 106 16.5 21 3 107 15.5 22 4 101 63.0 23 4 104 55.0 24 4 103 53.5 25 4 102 37.0 26 4 106 33.0 27 4 105 26.0 28 4 107 9.5 29 5 101 68.0 30 5 104 59.0 31 5 103 56.5 32 5 102 42.5 33 5 106 34.5 34 5 105 32.0 35 5 107 11.5

rmr2使用提示:

1) rmr.options(backend = hadoop )

这里backend有两个值,hadoop,local。hadoop是默认值,使用hadoop环境运行程序。local是一个本地测试的设置,已经不建议再使用。我在开发时,试过local设置,运行速度非常快,模拟了hadoop的运行环境。但是,local模式下的代码,不能和hadoop模式下完全兼容,变动也比较大,因此不建议大家使用。 2) equijoin(…,outer=c( left ))

这里outer包括了4个值,c(“”, “left”, “right”, “full”),非常像数据库中两个表的join操作

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

3) keyval(k,v)

mapReduce的操作,需要key和valve保存数据。如果直接输出,或者输出的未加key,会有一个警告Converting to.dfs argument to keyval with a NULL key。再上一篇文章中,rmr2的例子中就有类似的情况,请大家注意修改代码。

> to.dfs(1:10)

Warning message:

In to.dfs(1:10) : Converting to.dfs argument to keyval with a NULL key

代码部分:

#加载rmr2包 library(rmr2)

#输入数据文件

train<-read.csv(file="small.csv",header=FALSE) names(train)<-c("user","item","pref")

#使用rmr的hadoop格式,hadoop是默认设置。 rmr.options(backend = 'hadoop')

#把数据集存入HDFS

train.hdfs = to.dfs(keyval(train$user,train)) from.dfs(train.hdfs)

> from.dfs(train.hdfs)

13/04/07 14:35:44 INFO util.NativeCodeLoader: Loaded the native-hadoop library 13/04/07 14:35:44 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library

13/04/07 14:35:44 INFO compress.CodecPool: Got brand-new decompressor $key

[1] 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 5 5

$val

user item pref 1 1 101 5.0 2 1 102 3.0 3 1 103 2.5 4 2 101 2.0 5 2 102 2.5 6 2 103 5.0 7 2 104 2.0 8 3 101 2.0

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

9 3 104 4.0 10 3 105 4.5 11 3 107 5.0 12 4 101 5.0 13 4 103 3.0 14 4 104 4.5 15 4 106 4.0 16 5 101 4.0 17 5 102 3.0 18 5 103 2.0 19 5 104 4.0 20 5 105 3.5 21 5 106 4.0

#STEP 1, 建立物品的同现矩阵

# 1) 按用户分组,得到所有物品出现的组合列表。 train.mr<-mapreduce( train.hdfs,

map = function(k, v) { keyval(k,v$item) }

,reduce=function(k,v){ m<-merge(v,v) keyval(m$x,m$y) } )

from.dfs(train.mr)

$key

[1] 101 101 101 101 101 101 101 101 101 101 101 101 101 101 101 102 102 102 102 [20] 102 102 102 103 103 103 103 103 103 103 103 103 103 103 104 104 104 104 104 [39] 104 104 104 104 104 104 104 105 105 105 105 106 106 106 106 107 107 107 107 [58] 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 104 [77] 104 104 104 104 104 105 105 105 105 105 105 106 106 106 106 106 106

$val

[1] 101 102 103 101 102 103 104 101 104 105 107 101 103 104 106 101 102 103 101 [20] 102 103 104 101 102 103 101 102 103 104 101 103 104 106 101 102 103 104 101 [39] 104 105 107 101 103 104 106 101 104 105 107 101 103 104 106 101 104 105 107 [58] 101 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106 101 [77] 102 103 104 105 106 101 102 103 104 105 106 101 102 103 104 105 106

# 2) 对物品组合列表进行计数,建立物品的同现矩阵

详细介绍R+Hadoop系统结构、案例以及优缺点分析等

step2.mr<-mapreduce( train.mr,

map = function(k, v) { d<-data.frame(k,v)

d2<-ddply(d,.(k,v),count)

key<-d2$k val<-d2

keyval(key,val) } )

from.dfs(step2.mr)

$key

[1] 101 101 101 101 101 101 101 102 102 102 102 102 102 103 103 103 103 103 103 [20] 104 104 104 104 104 104 104 105 105 105 105 105 105 105 106 106 106 106 106 [39] 106 107 107 107 107

$val

k v freq 1 101 101 5 2 101 102 3 3 101 103 4 4 101 104 4 5 101 105 2 6 101 106 2 7 101 107 1 8 102 101 3 9 102 102 3 10 102 103 3 11 102 104 2 12 102 105 1 13 102 106 1 14 103 101 4 15 103 102 3 16 103 103 4 17 103 104 3 18 103 105 1 19 103 106 2 20 104 101 4 21 104 102 2 22 104 103 3 23 104 104 4 24 104 105 2

本文来源:https://www.bwwdw.com/article/b9i4.html

Top