sparklyr使用相关
连接Spark
安装好sparklyr包之后,我们连接本地的Spark,也可以连接远程的Spark集群。这里,我们使用spark_connect函数来连接远程的Spark集群:
```{r eval=FALSE}
library(sparklyr)
library(dplyr)
# Connect to the cluster
config <- spark_config()
# config$spark.driver.cores <- 4
# config$spark.executor.cores <- 4
# config$spark.executor.memory <- "4G"
SPARK_HOME <- "/opt/cloudera/parcels/CDH/lib/spark"
spark_version <- '1.6.0'
sc <- spark_connect(master="yarn-client", version=spark_version, config=config, spark_home=SPARK_HOME)
src_tbls(sc)
# 返回的Spark连接(sc)为Spark集群提供了一个远程的dplyr数据源。
```
读取数据
使用copy_to函数可以实现将R中的数据框导入到Spark。下面我将R自带的iris数据集,nycflights13包的flights数据集,以及Lahman包的Batting数据集复制到Spark(请确保安装了这两个包)。
```{r eval=FALSE}
# install.packages(c("nycflights13", "Lahman"))
library(nycflights13)
library(Lahman)
iris_tbl <- copy_to(sc, iris)
flights_tbl <- copy_to(sc, nycflights13::flights, "flights")
batting_tbl <- copy_to(sc, Lahman::Batting, "batting")
```
列出所有的表
使用dplyr的src_tbls函数可以列出所有可用的表(包括预先加载在集群内的表)。
```{r eval=FALSE}
src_tbls(sc)
```
使用dplyr
```{r eval=FALSE}
flights_tbl <- tbl(sc, "flights")
head(flights_tbl)
library(knitr)
kable(data.frame(head(flights_tbl)))
```
利用dplyr语法来对集群内的所有表进行操作,下面是一个简单的数据筛选案例:
filter by departure delay and print the first few records【筛选出飞机晚点两分钟的航班信息】
```{r eval=FALSE}
flights_tbl %>% filter(dep_delay == 2)
```
dplyr导论提供了许多dplyr包中函数的使用案例。以下案例演示的是航班延误信息的数据可视化:
```{r eval=FALSE}
delay <- flights_tbl %>%
group_by(tailnum) %>%
summarise(count = n(), dist = mean(distance), delay = mean(arr_delay)) %>%
filter(count > 20, dist < 2000, !is.na(delay)) %>%
collect
```
绘图
```{r eval=FALSE}
library(ggplot2)
ggplot(delay, aes(dist, delay)) +
geom_point(aes(size = count), alpha = 1/2) +
geom_smooth() +
scale_size_area(max_size = 2)
```
窗口函数
支持dplyr的窗口函数。如下所示:
```{r eval=FALSE}
batting_tbl %>%
select(playerID, yearID, teamID, G, AB:H) %>%
arrange(playerID, yearID, teamID) %>%
group_by(playerID) %>%
filter(min_rank(desc(H)) <= 2 & H > 0)
```
调用MLlib
利用sparklyr包中的MLlib函数可以实现在Spark集群中调用机器学习算法。
这里,我们使用ml_linear_regression函数来拟合一个线性回归模型。数据为内置的mtcars数据集,我们想看看能否通过汽车的重量(wt)和发动机的气缸数(cyl)来预测汽车的油耗(mpg)。我们假设mpg跟这两个变量之间的关系是线性的。
```{r eval=FALSE}
# 将mtcar数据集复制到spark
mtcars_tbl <- copy_to(sc, mtcars)
# 先对数据做变换,然后将数据集分割为训练集和测试集
partitions <- mtcars_tbl %>%
filter(hp >= 100) %>%
mutate(cyl8 = cyl == 8) %>%
sdf_partition(training = 0.5, test = 0.5, seed = 1099)
# 对训练数据集做模型拟合
fit <- partitions$training %>%
ml_linear_regression(response = "mpg", features = c("wt", "cyl"))
summary(fit)
# 断开库连接
spark_disconnect(sc)
```
查看可用的spark版本
```{r eval=FALSE}
spark_available_versions()
```
几个重要的函数
将文件的数据读入spark:spark_read_csv、spark_read_json、spark_read_parquet。以csv为例
```{r eval=FALSE}
spark_read_csv(sc, name="mydata", path="xx.csv", header=TRUE)
```
将本地R数据集copy to spark
```{r eval=FALSE}
library(nycflights13)
flights <- copy_to(sc, flights, "flights")
src_tbls(sc) # 列出source里的tbls
```
将数据从spark复制到R内存
```{r eval=FALSE}
mydata1 <- collect(flights)
```
将结果保存为临时数据集
```{r eval=FALSE}
compute(mydata1,"flights")
```
将dplyr的语句转化为spark sql
```{r eval=FALSE}
bestworst = flights %>%
group_by(year,month,day) %>%
select(dep_delay) %>%
filter(dep_delay == min(dep_delay) | dep_delay == max(dep_delay))
sql_render(bestworst) # 返回sql结果
```
将结果写入HDFS
```{r eval=FALSE}
spark_write_parquet(tbl,"hdfs://hdfs.company.org:9000/hdfs-path/data")
```
意外发现了dplyr里的抽样函数,可设置replace = TRUE
```{r eval=FALSE}
sample_n(data, 10) # 随机取10条
sample_frac(data, 0.01) # 随机抽1%
```
在这里需要注意的是,当sparklyr提供对dplyr支持时,在使用sparklyr时,并不一定必须要使用dplyr。比如可以使用DBI 而不使用dplyr。
```{r eval=FALSE}
library(DBI)
sc <- spark_connect(master = "local")
sdf_copy_to(sc, iris)
dbGetQuery(sc, "SELECT * FROM flights LIMIT 4")
```
读写数据
```{r eval=FALSE}
temp_csv <- tempfile(fileext = ".csv")
temp_parquet <- tempfile(fileext = ".parquet")
temp_json <- tempfile(fileext = ".json")
spark_write_csv(iris_tbl, temp_csv)
iris_csv_tbl <- spark_read_csv(sc, "iris_csv", temp_csv)
spark_write_parquet(iris_tbl, temp_parquet)
iris_parquet_tbl <- spark_read_parquet(sc, "iris_parquet", temp_parquet)
spark_write_csv(iris_tbl, temp_json)
iris_json_tbl <- spark_read_csv(sc, "iris_json", temp_json)
src_tbls(sc)
## [1] "batting" "flights" "iris" "iris_csv"
## [5] "iris_json" "iris_parquet" "mtcars"
```
编写扩展
```{r eval=FALSE}
# write a CSV
tempfile <- tempfile(fileext = ".csv")
write.csv(nycflights13::flights, tempfile, row.names = FALSE, na = "")
# define an R interface to Spark line counting
count_lines <- function(sc, path) {
spark_context(sc) %>%
invoke("textFile", path, 1L) %>%
invoke("count")
}
# call spark to count the lines of the CSV
count_lines(sc, tempfile)
## [1] 336777
```
dplyr Utilities
```{r eval=FALSE}
tbl_cache(sc, "batting") # 把表载入内存
tbl_uncache(sc, "batting") # 把表从内存中卸载
```
连接Utilities
```{r eval=FALSE}
spark_web(sc) #Spark web console
spark_log(sc, n = 10) #输出日志
```
关闭与Spark的连接
```{r eval=FALSE}
spark_disconnect(sc)
```
连接代码参考1
```{r eval=FALSE}
library(sparklyr)
spark_install()
sc <- spark_connect("local")
my_tbl <- copy_to(sc, iris)
spark_connect("spark://spark.company.org:7077")
my_tbl <- tbl(sc, "tblname")
```
连接代码参考2
```{r eval=FALSE}
library(sparklyr)
library(dplyr)
library(ggplot2)
# install.packages('nycflights13')
# install.packages('Lahman')
library(nycflights13)
library(Lahman)
Sys.setenv(SPARK_HOME="/opt/cloudera/parcels/CDH/lib/spark")
config <- spark_config()
sc <- spark_connect(master="yarn-client", config=config, version='1.6.0')
iris_tbl <- copy_to(sc, iris)
flights_tbl <- copy_to(sc, nycflights13::flights, "flights")
batting_tbl <- copy_to(sc, Lahman::Batting, "batting")
src_tbls(sc)
library(DBI)
iris_preview <- dbExecute(sc, "select * from crawler.lianjia_esf limit 10")
head(iris_preview)
# jjsesf_online_hsl_house_library
# jjsesf_online_hsl_key
# jjsesf_online_yw_community_dg
# jjsesf_online_yw_community_fh
# jjsesf_online_yw_community_info
dbExecute(sc, "show databases")
dbExecute(sc, "show tables")
dbExecute(sc, "describe sdata.jjsesf_online_yw_community_dg")
test_data <- dbExecute(sc, "select * from sdata.jjsesf_online_yw_community_dg limit 10")
head(test_data)
test_data <- dbGetQuery(sc, "select * from sdata.jjsesf_online_hsl_key limit 10")
head(test_data)
# ?dbGetQuery
# ?dbExecute
```
参考网址
Using Spark with Shiny and R Markdown
RStudio又搞出了个大杀器!sparklyr包:实现Spark与R的接口,会用dplyr就能玩Spark
Analyzing US flight data on Amazon S3 with sparklyr and Apache Spark 2.0
实用 | 使用sparklyr和Apache Spark 2.0分析Amazon S3上的美国航班数据
Introduction to Spark in R using sparklyr
Ubuntu 下安装sparklyr 并连接远程spark集群
深入对比数据科学工具箱: SparkR vs Sparklyr
sparklyr
blog.csdn.net/yepeng2007fei/article/details/75503113
blog.csdn.net/faith_mo_blog/article/details/52194590
zhuanlan.zhihu.com/harryzhustudio
blog.csdn.net/sinat_26917383/article/details/52749138
blog.csdn.net/sinat_26917383/article/details/52749159
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。