COS数据分析沙龙第十一期(北京)

配图

2013年6月23日,十一期COS数据分析沙龙(北京站)在明主1016如期举行。本期沙龙主题是“RHadoop助R突破大数据难关”;沙龙嘉宾张丹先生围绕沙龙主题分享了有关在ubuntu系统下配置RHadoop的相关知识以及基于RHadoop完成数据分析工作的相关案例。

张丹先生,系资深程序开发员,R语言爱好者;前天际网职员,混迹互联网和软件行业多年;曾参与开发多种不同类型的系统及应用,熟悉R/JAVA/PHP/Javacript等语言。对系统架构、编程算法、数据分析等诸多领域有自身见解,并推出了两款互联网小应用:晒粉丝每日天气

沙龙开始嘉宾先对RHadoop项目的基本情况作了简要介绍:RHadoop是由RevolutionAnalytics发起的基于R语言的开源数据分析项目。目前,RHadoop系列包包含rmrrhdfsrhbase三个R包,其分别与Hadoop系统架构中的MapReduceHDFSHBase相应。由于它们并未发布到CRAN上,因此,需要到github上的RHadoop`主页来寻找,具体地址在这里

接下来,介绍了安装RHadoop需要的系统环境以及在Ubuntu系统下安装R软件的命令。由于RHadoop包在使用过程中要调用多个其它支撑包,因此,在安装之前,需要安装好rJavareshape2RcppiteratorsitertoolsdigestRJSONIOfunctional等8个支撑包。完成上述步骤之后,即可安装rhdfsrmr2包了。

RHadoop的命令与原生Hadoop命令相仿,只是为了调用方便做了一些封装。以rhdfs包为例。查看hdfs文件目录的Hadoop原生语句是:

hadoopfs-ls/user

其对应的RHadoop的命令语句是:

hdfs.ls(”/user/“)

查看hadoop数据文件的hadoop语句是:

hadoopfs-cat /user/hdfs/o_same_school/part-m-00000

其对应的RHadoop的命令是:

hdfs.cat(”/user/hdfs/o_same_school/part-m-00000″)

课件RHadoop的命令更符合R用户的习惯。

rmr2包是帮助R实现Map-Reduce算法的包,基于它我们可以做很多提高效率的事情。一个简单的例子是:

small.ints= 1:100000
sapply(small.ints, function(x) x^2)

基于rmr2的命令是:

small.ints= to.dfs(1:100000)
mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
from.dfs("/tmp/RtmpWnzxl4/file5deb791fcbd5")

由于MapReduce只能访问HDFS文件系统,因而,使用MapReduce功能之前需要借助to.dfs()函数将数据存储到HDFS文件系统里。调用MapReduce的运算结果时需要借助from.dfs()函数从HDFS文件系统中将其取出。

下面可以借助rmr2包对某个*.txt文件中出现的英文单词进行计数,相应的代码为:

input<-'/user/hdfs/o_same_school/part-m-00000'
wordcount= function(input, output = NULL, pattern = " "){
wc.map = function(., lines) {
keyval(unlist( strsplit( x = lines,split= pattern)),1)
}
wc.reduce=function(word, counts ) {
keyval(word, sum(counts))
}
mapreduce(input = input ,output = output, input.format= "text",
map = wc.map, reduce = wc.reduce,combine= T)
}
wordcount(input)

RHadoop系列包的最后一个包是RHbase,它相当于是一个管理数据库的包。其包含的函数如下:

  • hb.compact.table
  • hb.describe.table
  • hb.insert
  • hb.regions.table
  • hb.defaults
  • hb.get
  • hb.insert.data.frame
  • hb.scan
  • hb.delete
  • hb.delete
  • hb.get.data.frame
  • hb.list.tables
  • hb.scan.ex
  • hb.delete.table
  • hb.init
  • hb.new.table
  • hb.set.table.mode

沙龙最后,嘉宾分享了基于原生R代码和RHadoop 实现推荐系统中经常用到的协同过滤算法的内容。协同过滤算法的原生思想比较简单,包含以下三个步骤:

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

对应的原生R代码和RHadoop代码分别是:

加载plyr包

library(plyr)

读取数据集

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

计算用户列表

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

计算商品列表方法

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

用户列表

users<-usersUnique()
users

商品列表

items<-itemsUnique()
items

建立商品列表索引

index<-function(x) which(items %in% x)
data<-ddply(train,.(user,item,pref),summarize,idx=index(item))

同现矩阵

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)])
     m<-merge(idx,idx)
       for(iin 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])
   ## 推荐结果取前num个
   if(num>0) topn<-head(topn,num) 
   ## 返回结果
   return(topn)
}

来自百度(销售管理中心)、新浪、IBM、亚马逊、京东、豆瓣、小米、去哪儿、中科软、泽佳、华丽志、宽连十方;ICON、新华网、
银华基金、诺亚舟财务咨询有限公司、富国基金、安永;中国铁道科学研究院、中科院地理所、密苏里大学哥伦比亚、中国人民大学、
中国中医科学院、苏州大学、北京邮电大学等企业和高校的人员报名参与了此次活动,席间与嘉宾积极互动,围绕主题展开了深入精彩的讨论。

幻灯片下载

COS数据沙龙第9期幻灯片

现场图片

rhadoop-cos4

沙龙视频:

预告片

自我介绍

第一部分 – RHadoop的安装与使用介绍

第二部分 – R实现MapReduce协同过滤算法

第三部分 – 操作演示

第四部分 – 自由讨论

更多沙龙信息请查看 http://cos.name/salon



关于邓一硕

专注于R语言在金融投资分析和计量经济学中的应用;《R in a Nut Shell》、《R Graphics Cookbook》、《Introductory Statistics with R》等书的译者。

COS数据分析沙龙第十一期(北京)》有10个想法

  1. 丹哥,原先的视频优酷上没有了,请问还可以再上传一次吗?

发表评论

电子邮件地址不会被公开。 必填项已用*标注