如何在CDSW中使用R绘制直方图
温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
1.文档编写目的
Cloudera的新产品CDSW(Cloudera Data Science Workbench)集成了R、Scala、Python2、Python3等语言进行统计和数据分析。本文档主要讲述如何在CDSW中使用R语言绘制直方图和饼图,并使用Hive数仓作为数据源。
- 内容概述
1.创建R工程
2.工程启动及示例运行
3.R直方图示例代码
4.R饼图示例代码
- 测试环境
1.CM和CDH版本为5.11.2
2.RedHat7.2
3.CDSW1.1.1
- 前置条件
1.CDH集群正常
2.Impala/Hive中已有TPC_DS相应的表和数据
3.CDSW安装且正常运行
2.创建R工程
1.登录CDSW平台
2.点击“New Project”创建R工程,输入工程名称,选择模板为R
3.点击“Create Project”,完成R工程创建
创建工程选择Template模板时会附带R的示例。
3.启动工程及运行示例
1.进入myfirstR工程
2.点击“Open Workbench”
3.选择R运行环境及 Engine配置
4.点击“Launch Session”
5.等待容器启动成功
6.验证是否启动成功
以上version内容正常显示,terminal均能正常打开则表示启动成功。
7.运行示例
显示如下
点击运行Run或者旁边播放按钮运行代码(Run可以逐行运行或者运行所有)
运行结果
整个界面由三个区域组成,左边工程文件列表,中间代码显示区域,右边运行结果展示。
4.R直方图示例代码
1.安装R依赖包
## 安装R运行依赖包
install.packages("Rcpp",dependencies = TRUE)
install.packages("gcookbook",dependencies = TRUE)
install.packages("data.table",dependencies = TRUE)
install.packages("ggplot2",dependencies = TRUE)
install.packages("RJDBC")
2.创建一个新的R文件
3.编写R绘制直方图代码
## 加载R运行依赖包
library(ggplot2)
library(gcookbook)
library(data.table)
library(DBI)
library(rJava)
library(RJDBC)
## 将R连接Impala所依赖的jar包加载到当前运行环境
hadoop.class.path = list.files(path=c("/opt/cloudera/parcels/CDH/lib/hadoop"),pattern="jar", full.names=T);
#hive.class.path = list.files(path=c("/opt/cloudera/parcels/CDH/lib/hive/lib"),pattern="jar", full.names=T); #此处是加载Hive的依赖包,如果使用hive jdbc则加载相应的依赖包
impalajdbc.class.path = list.files(path=c("/driver/impalajdbc"), pattern="jar", full.names=T)
cp = c(hadoop.class.path,impalajdbc.class.path)
.jinit(classpath=cp,parameters="-Djavax.security.auth.useSubjectCredsOnly=false")
## 设置Java运行参数
options(java.parameters = "-Xmx8g")
## 使用RJDBC连接Impala
drv <- JDBC("com.cloudera.impala.jdbc41.Driver", "/driver/impalajdbc/ImpalaJDBC41.jar",identifier.quote="`")
conn <- dbConnect(drv, "jdbc:impala://ip-172-31-26-80.ap-southeast-1.compute.internal:21050/tpcds_parquet")
## 获取当前时间
tt <- Sys.time()
sql = "select tt.scope,count(*) count from (
select case
when cs_sales_price >=0 and cs_sales_price < 15 then '1'
when cs_sales_price >= 15 and cs_sales_price < 30 then '2'
when cs_sales_price >=30 and cs_sales_price < 45 then '3'
when cs_sales_price >= 45 and cs_sales_price < 60 then '4'
when cs_sales_price >= 60 and cs_sales_price < 75 then '5'
when cs_sales_price >= 75 and cs_sales_price < 100 then '6'
when cs_sales_price >= 100 then '7'
else '8'
end as scope,cs_sales_price
from catalog_sales ) tt GROUP BY tt.scope"
## 执行SQL获取查询结果
tabledata <- dbGetQuery(conn, sql)
## 将SQL返回的结果转化为data.table数据集
VDT <- data.table(tabledata)
## 设置直方图的横坐标和纵坐标及类型
p <- ggplot(VDT, aes(x=scope, y=count)) + geom_bar(stat="identity")
### 销售额区间分布直方图
p + scale_x_discrete(breaks=c("1","2","3","4","5","6","7","8"),
labels=c("0~15","15~30","30~45","45~60","60~75","75~100","100~","other"))
## 输出直方图耗时:
Sys.time() - tt
dbDisconnect(conn) #关闭连接
4.示例运行
5.R饼图示例代码
- 编写R绘制饼图代码
## 加载R运行依赖包
library(ggplot2)
library(gcookbook)
library(data.table)
library(DBI)
library(rJava)
library(RJDBC)
## 将R连接Impala所依赖的jar包加载到当前运行环境
hadoop.class.path = list.files(path=c("/opt/cloudera/parcels/CDH/lib/hadoop"),pattern="jar", full.names=T);
#hive.class.path = list.files(path=c("/opt/cloudera/parcels/CDH/lib/hive/lib"),pattern="jar", full.names=T);
impalajdbc.class.path = list.files(path=c("/driver/impalajdbc"), pattern="jar", full.names=T)
cp = c(hadoop.class.path,impalajdbc.class.path)
.jinit(classpath=cp,parameters="-Djavax.security.auth.useSubjectCredsOnly=false")
## 设置Java运行参数
options( java.parameters = "-Xmx8g" )
## 使用RJDBC连接Impala
drv <- JDBC("com.cloudera.impala.jdbc41.Driver", "/opt/cloudera/parcels/CDH/lib/hive/lib/hive-jdbc.jar",identifier.quote="`")
conn <- dbConnect(drv, "jdbc:impala://ip-172-31-26-80.ap-southeast-1.compute.internal:21050/tpcds_parquet")
## 获取当前时间
tt <- Sys.time()
sql = "select tt.scope,count(*) count from (
select case
when cs_sales_price >=0 and cs_sales_price < 15 then '1'
when cs_sales_price >= 15 and cs_sales_price < 30 then '2'
when cs_sales_price >=30 and cs_sales_price < 45 then '3'
when cs_sales_price >= 45 and cs_sales_price < 60 then '4'
when cs_sales_price >= 60 and cs_sales_price < 75 then '5'
when cs_sales_price >= 75 and cs_sales_price < 100 then '6'
when cs_sales_price >= 100 then '7'
else '8'
end as scope,cs_sales_price
from catalog_sales ) tt GROUP BY tt.scope"
## 执行SQL获取查询结果
tabledata <- dbGetQuery(conn, sql)
## 将SQL返回的结果转化为data.table数据集
VDT <- data.table(tabledata)
## 用order()让数据框的数据按 scope 列数据从大到小排序
VDT = VDT[order(VDT$scope, decreasing = TRUE),]
## 将数字1替换为"0~15"方式
myLabel = c("0~15","15~30","30~45","45~60","60~75","75~100","100~","other")
myLabel = paste(myLabel, "(", round(VDT$count / sum(VDT$count) * 100, 2), "%)", sep = "")
## 绘制销售额区间分布饼图
ggplot(VDT, aes(x = "", y = count, fill = scope)) +
geom_bar(stat = "identity", width = 1) + ## width >= 1 时中心的杂点将消失
coord_polar(theta = "y") +
labs(x = "", y = "", title = "") +
theme(axis.ticks = element_blank()) +
theme(legend.title = element_blank(), legend.position = "top") +
scale_fill_discrete(breaks = VDT$scope, labels = myLabel) +
theme(axis.text.x = element_blank()) ## 白色的外框即是原柱状图的X轴,把X轴的刻度文字去掉即可
## 输出饼图耗时:
Sys.time() - tt
dbDisconnect(conn)
#关闭连接
2.示例运行效果
醉酒鞭名马,少年多浮夸! 岭南浣溪沙,呕吐酒肆下!挚友不肯放,数据玩的花! 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- layui数据表格自定义每页条数limit设置
- Laravel 集成微信用户登录和绑定的实现
- PHP实现微信对账单处理
- Laravel5.1框架路由分组用法实例分析
- PHP的HTTP客户端Guzzle简单使用方法分析
- laravel 框架实现无限级分类的方法示例
- 详解Laravel5.6通过路由进行API版本控制的简单方法
- php+layui数据表格实现数据分页渲染代码
- thinkPHP框架乐观锁和悲观锁实例分析
- PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
- laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
- Laravel框架实现即点即改功能的方法分析
- PHP使用PDO实现mysql防注入功能详解
- laravel接管Dingo-api和默认的错误处理方式
- PHP接入微信H5支付的方法示例