R是数据科学家中最流行的编程语言之一, 但目前R的运行受限于单机的内存容量,无法满足大数据时代的海量数据处理需求。Apache顶级开源项目Spark是Hadoop之后备受关注的新一代分布式计算平台,于是,R和Spark的强强结合使得SparkR应运而生。SparkR是一个R语言包,它提供了轻量级的方式,使得可以在R语言中使用Apache Spark。通过用R语言编写Spark程序,允许数据科学家分析大规模的数据集,并通过R shell交互式地在SparkR上运行作业。2015年4月,SparkR已经合并到Apache Spark中,并随着Spark 1.4版本一起发布!
本人最近也体验了一把SparkR,采用的数据是一份搜索产品的明细,是一家购物比价搜索网站的2012年双11节前节后一周和2013年618前后一周的数据。代码是指导手下的实习生做的,Spark版本是2.1.1,话不多说,直接上效果
(一)数据读入
df<-read.df("file:///home/baoyu/datas/JT_data.csv","csv",header="true") #本地模式,创建SparkR DataFrame
head(df)
(二)部分字段统计:
b=summarize(groupBy(df, df$SHOP), count = n(df$SHOP))
head(arrange(b, desc(b$count)))
c=summarize(groupBy(df, df$MAIN_CATE), count = n(df$MAIN_CATE))
head(arrange(c, desc(c$count)))
(三)搜索量排名
搜索量排前十名的网店:
createOrReplaceTempView(b,"b") # 创建临时表
b1=head(arrange(b, desc(b$count)),10)
bs1=sum(b1$count)
bs2=sql("select sum(count) from b") # 类SQL查询
bb=(as.data.frame(bs2)-bs1)[,1] # 转化为R DataFrame
row=c(' Other ',bb)
b1=rbind(b1,row)
b1[,2]=as.numeric(b1[,2])
b1=b1[order(b1[,2],decreasing=T),]
precent=round(b1$count/sum(b1$count)*100)
label=paste(paste(c("Other ","淘宝网","京东商城","当当网商城","当当网","亚马逊中国","易迅网"," 1号店","苏宁易购","唯品会","库巴"),":"),precent,"%",sep="")
pie(b1[,2],labels=label,main="TOP10 SHOP",radius=1)
通过跟上面类似的代码分析,可以得到搜索量排前十名的城市:
(四)价格分布
createOrReplaceTempView(df,"df")
sparkR.session()
把价格分成几个区间
g1=sql("select count(*) from df WHERE PRICE<500")
g2=sql("select count(*) from df WHERE PRICE>500 and PRICE<5000")
g3=sql("select count(*) from df WHERE PRICE>5000 and PRICE<10000")
g4=sql("select count(*) from df WHERE PRICE>10000 and PRICE<50000")
g5=sql("select count(*) from df WHERE PRICE>50000 and PRICE<500000")
g6=sql("select count(*) from df WHERE PRICE>500000 and PRICE<1000000")
g1=as.data.frame(g1)
g2=as.data.frame(g2)
g3=as.data.frame(g3)
g4=as.data.frame(g4)
g5=as.data.frame(g5)
g6=as.data.frame(g6)
price=rbind(g1,g2,g3,g4,g5,g6)
par(mfrow=c(1,1))
hist(price[,1])
row=c("<500","500~1000","1000~5000","5000~50000","50000~500000","500000~1000000")
column=c("connt")
dimnames(price)=list(row,column)
price
(五)时段分布
下面看一下,各个时段的搜索量变化。
t =sql("SELECT SUBSTRING(TIME,-5,2) as time FROM df")
t1=summarize(groupBy(t, t$time), count = n(t$time))
t2=arrange(t1, asc (t1$time))
t3=as.data.frame(t2)
plot(t3,type='b')
barplot(t(t3))
可见,10点以后进入搜索的高峰期,一直持续到午夜。
在大数据的时代背景下,Spark支持R API对熟悉R语言的数据科学家来说是一个利器。更多关于SparkR的资料,可以参考官方网站:http://spark.apache.org/docs/latest/sparkr.html。
在下一篇《用SparkR探索电商数据(二)》的文章中,我们将贴上机器学习的案例。