【问题标题】:How to return local variable value from a function written in R using spark.lapply()如何使用 spark.lapply() 从用 R 编写的函数返回局部变量值
【发布时间】:2021-04-08 11:06:24
【问题描述】:

我已经定义了一些用 R 语言编写的函数...现在我正在尝试使用“spark.lapply”来并行化该函数。 所以到底发生了什么,我在函数内部定义了一个空向量,并且值在函数内部填充。

input_1:R 数据帧(虹膜数据)

函数定义:

agg_sum <- function(RowNum){
 test <- "Hello"
  input_1$sum <- input_1$Sepal.Length + RowNum
}

函数调用

output_1 <- spark.lapply(1:5,function(RowNum) agg_sum(RowNum))

所以,如果我在使用 spark.lapply() 调用函数后稍后在代码中调用向量,我会收到错误消息:Error:object 'test' not found

【问题讨论】:

  • 能否提供minimal reproducible example的代码,以便其他人更好地理解问题以便帮助您?
  • @Waldi 我已经添加了我的函数示例,我想要实现的目标
  • 据我所知,像input_1 这样的全局变量必须在Spark 中声明才能使用它们。

标签: r apache-spark lapply databricks sparkr


【解决方案1】:

只需返回一个列表,其中包含您要从每个函数执行中导出的所有值。最好避免考虑全局或可变变量,并将计算想象为应用映射函数。

按照您的示例代码:

library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib")))

sparkR.session(master = "local[4]", sparkConfig = list(spark.driver.memory = "2g"))

agg_fun <- function(row_num){
  internal_var <- paste(c("Hello", row_num), collapse = "")
  main_result <- row_num + 1000
  
  list(internal_var = internal_var, main_result = main_result)
}

output_1 <- spark.lapply(1:3, function(RowNum) agg_fun(RowNum))

agg_fun 计算 main_resultinternal_var。该函数返回具有两个值的列表。 spark.lapply 会将结果组合在一起作为列表列表:

[[1]]
[[1]]$internal_var
[1] "Hello1"

[[1]]$main_result
[1] 1001


[[2]]
[[2]]$internal_var
[1] "Hello2"

[[2]]$main_result
[1] 1002


[[3]]
[[3]]$internal_var
[1] "Hello3"

[[3]]$main_result
[1] 1003

然后,如果您只想选择 internal_var 值,请遍历它们:

> sapply(output_1, FUN = function(x) x$internal_var)
[1] "Hello1" "Hello2" "Hello3"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2018-05-17
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2017-03-11
    相关资源
    最近更新 更多