如何使用Hive&R从Hadoop集群中提取数据进行分析

一个简单的例子!

环境:CentOS6.5

Hadoop集群、Hive、R、RHive,具体安装及调试方法见博客内文档。

1、分析题目

--有一个用户数据样本(表名huserinfo)10万数据左右;
--其中有一个字段:身份证号(id_card)
--身份证号前两位代表:省,例如:11北京,12天津,13河北;
--身份证前x位对照表(表名hidcard_province)
--要求1:计算出每个省份出现的次数,并按从大到小排序取前30个;
--要求2:使用R画出柱状图。

2、编写Hive提取数据脚本:hive_getdata.sql

--创建临时表
DROP TABLE if exists tmp.t_province;
CREATE TABLE tmp.t_province(
id int,
p_name string,
cnt int
) COMMENT '用户数据中省份出现次数临时表' --将提取到的数据保存到临时表中
insert overwrite table tmp.t_province
select t1.cid, t2.province, t1.cnt from(
--取出前30条
select y.rownum, y.cid, y.cnt from(
--排序
select x.cid, x.cnt, row_number() over (distribute by x.cnt sort by x.cnt desc) as rownum from(
--分组
select a1.cid, count(1) as cnt from
--取数据
(select substring(id_card, 0, 2) as cid from bdm.huserinfo)a1
group by a1.cid
)x
)y where y.rownum <= 30
)t1
join bdm.hidcard_province t2 on t2.id = t1.cid

运行:

[root@Hadoop-NN-01 ~]$ hive -f hive_getdata.sql

查看数据如下图:

hive> select * from tmp.t_province limit 10;

如何使用Hive&R从Hadoop集群中提取数据进行分析

3、编写R语言绘图脚本:r_draw.r

#!/usr/bin/Rscript
library(RHive);  #加载rhive包
rhive.connect(host ='192.168.100.20');  #rhive连接hive
x <- rhive.query('select id from tmp.t_province')
x <- x$id
y <- rhive.query('select cnt from tmp.t_province')
y <- y$cnt library(Cairo)   #加载图形渲染库 png("r-province-pic.png", width=960, height=600)  #生成图片
#说明:此里可以处理很多问题,可以使用很多算法解决很多的问题,具体算法我就不写了,只简单画个柱柱图,把代码跑通即可!
barplot(beside=TRUE,
y,   #纵轴
names.arg=x,   #横轴
ylim=c(0,10000)  #纵轴取值范围  还有其它参数,可以根据自己需求设置。
) title(xlab="province name") #横轴名称
title(ylab="people number") #纵轴名称 #图例参数
lbls <- round(y/sum(y)*100)
lbls <- paste(lbls,"%",sep="")
lbls <- paste(x, lbls) #设置图例 其它参数根据自己需求设置
legend("topright", lbls) dev.off() #关闭绘图设备
rhive.close() #关闭hive连接

运行:

[root@Hadoop-NN-01 ~]$ Rscript r_draw.r

展示成果:

如何使用Hive&R从Hadoop集群中提取数据进行分析

至此,一个简单的Hadoop-Hive-R实例完成!

PS:R下面中文乱码的问题仍在解决中!

上一篇:JMETER从JSON响应中提取数据


下一篇:scrapy框架Selector提取数据