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

sparklyr-R语言访问Spark的另外一种方法

Sparklyr与Docker的推荐系统实战

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上的美国航班数据

sparklyr包--实现R与Spark接口

sparklyr包--實現R與Spark接口

Introduction to Spark in R using sparklyr

sparklyr初探

Ubuntu 下安装sparklyr 并连接远程spark集群

Sparklyr 0.5 已在CRAN正式发布

sparklyr 0.6

sparklyr 0.6

深入对比数据科学工具箱: SparkR vs Sparklyr

sparklyr包:实现Spark与R的接口

sparklyr初探,並連接Cassandra使用

最简便的SparkR安装方法


sparklyr

spark.rstudio.com

spark.rstudio.com/deployment

github.com/rstudio/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

zhuanlan.zhihu.com/p/21574497

blog.csdn.net/cq361106306/article/details/54237392

www.slideshare.net/SparkSummit

posted @ 2018-04-19 15:43  银河统计  阅读(1028)  评论(0)    收藏  举报