zoukankan      html  css  js  c++  java
  • 如何使用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;

    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

    展示成果:

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

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

  • 相关阅读:
    B01-java学习-阶段2-面向对象
    A11-java学习-二维数组-面向对象概念-类的编写-测试类的编写-创建对象-使用对象-递归
    09-java学习-数组-冒泡排序-选择排序-数组工具类编写-查找-扩容
    08-java学习-数组-增强for循环-数组与方法-main函数参数
    07-java学习-方法重载-idea集成开发工具学习-项目-模块-包
    执行SQL语句---SELECT
    执行SQL语句---INSERT/UPDATE/DELETE
    undefined reference to `mysql_init'解决办法
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
    网络编程(三)---数据报套接字
  • 原文地址:https://www.cnblogs.com/hunttown/p/5486039.html
Copyright © 2011-2022 走看看