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  银河统计  阅读(969)  评论(0编辑  收藏  举报