库加载未扩展到Spark中的函数

库加载未扩展到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

我有一个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.utilities
库中的一些函数,如下所示:

clean_data <- function(df) {
  ... 
  return(JC.utilities::reformat(df))
}
两个问题:

  • 为什么Spark不记得我已经加载了这个库
  • 有没有一种方法可以绕过这个问题,而不必明确地定义一大堆东西

  • 您在驱动程序上加载了库,但在单独工作空间上工作的执行器上没有加载库

    您需要在应用于数据帧的函数中导入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"