库加载未扩展到Spark中的函数
我有一个SparkR脚本,可以加载一些库,还可以定义来自其他源脚本的函数。它的头部看起来像这样:库加载未扩展到Spark中的函数,r,apache-spark,scope,sparkr,R,Apache Spark,Scope,Sparkr,我有一个SparkR脚本,可以加载一些库,还可以定义来自其他源脚本的函数。它的头部看起来像这样: library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"))) library(devtools) library(JC.utilities) # user-created source("path/to/clean_data.R") 其中clean_data.R使用JM.util
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))
library(devtools)
library(JC.utilities) # user-created
source("path/to/clean_data.R")
其中clean_data.R
使用JM.utilities
库中的一些函数,如下所示:
clean_data <- function(df) {
...
return(JC.utilities::reformat(df))
}
两个问题:
您在驱动程序上加载了库,但在单独工作空间上工作的执行器上没有加载库 您需要在应用于数据帧的函数中导入JC.utilities 如果在executors上根本没有安装库,则需要这样做,或者可以尝试这样做 我设计了一个简单的例子,用stringr库及其函数stru_length来说明我的观点:
> d<-data.frame(a=c("a", "abcd", "bb"), b=c(1,2,3))
> df <- as.DataFrame(d)
它起作用了!然后,让我们尝试计算第1列的字符数(我可以使用nchar,但目的是演示如何使用库)
它在司机室工作得很好。让我们试试spark:
> dapplyCollect(df, function(x) {cbind(x$a, x$b, x$b*x$b+1, str_length(x$a)) })
17/11/08 18:55:17 ERROR executor.Executor: Exception in task 0.0 in stage 10.0 (TID 10)
org.apache.spark.SparkException: R computation failed with
Error in cbind(x$a, x$b, x$b * x$b + 1, str_length(x$a)) :
could not find function "str_length"
正如我所解释的,在驱动程序中导入库不会在workers中导入库。但那正是我需要它的地方。现在,让我们在dapply中导入库:
> dapplyCollect(df, function(x) {library(stringr); cbind(x$a, x$b, x$b*x$b+1, str_length(x$a)) })
[,1] [,2] [,3] [,4]
[1,] "a" "1" "2" "1"
[2,] "abcd" "2" "5" "4"
[3,] "bb" "3" "10" "2"
这就对了。这是不正确的-我提交的时候集群中既没有安装
SparkR
,也没有安装其他软件包(即magrittr
)。这是因为,当您将R代码应用于数据帧的行时,工人负责使用R进行操作。如果您在行上执行的R代码依赖于库,则需要在工人上导入该库。这对我很有效。这是我如何在我的库中加载的问题。需要在我的dappy
函数中包含.libpath(“./myRLibs”)
,并在启动Spark时添加此标志:--archives myRLibs.tar.gz#myRLibs
我添加了一个简单的示例来说明所有这些。此主题与Spark版本相关吗?它最近有变化吗?1)你是在本地运行还是在纱线上运行?2) 尝试从加载SparkR
和JC.utilities
的同一脚本中运行clean_data
(即,无需另寻脚本);你还在犯错误吗?1)在纱线上奔跑。2) 当脚本直接运行而不是源代码运行时,也会出现同样的问题。然而,我想我们已经发现了如何解决这个问题。我会把这件事发出去的
> import(stringr)
> str_length("abcdef")
[1] 4
> dapplyCollect(df, function(x) {cbind(x$a, x$b, x$b*x$b+1, str_length(x$a)) })
17/11/08 18:55:17 ERROR executor.Executor: Exception in task 0.0 in stage 10.0 (TID 10)
org.apache.spark.SparkException: R computation failed with
Error in cbind(x$a, x$b, x$b * x$b + 1, str_length(x$a)) :
could not find function "str_length"
> dapplyCollect(df, function(x) {library(stringr); cbind(x$a, x$b, x$b*x$b+1, str_length(x$a)) })
[,1] [,2] [,3] [,4]
[1,] "a" "1" "2" "1"
[2,] "abcd" "2" "5" "4"
[3,] "bb" "3" "10" "2"