sparklyr spark_apply用户定义的函数错误

时间:2017-10-18 20:34:11

标签: r sparklyr

我正在尝试在spark_apply中传递一个自定义R函数,但仍然遇到问题并且无法弄清楚某些错误的含义。

library(sparklyr)
sc <- spark_connect(master = "local")
perf_df <- data.frame(predicted = c(5, 7, 20), 
                       actual = c(4, 6, 40))


perf_tbl <- sdf_copy_to(sc = sc,
                        x = perf_df,
                        name = "perf_table")

#custom function
ndcg <- function(predicted_rank, actual_rank) { 
  # x is a vector of relevance scores 
  DCG <- function(y) y[1] + sum(y[-1]/log(2:length(y), base = 2)) 
  DCG(predicted_rank)/DCG(actual_rank) 
} 

#works in R using R data frame
ndcg(perf_df$predicted, perf_df$actual)


    #does not work
  perf_tbl %>%
  spark_apply(function(e) ndcg(e$predicted, e$actual),
              names = "ndcg")

1 个答案:

答案 0 :(得分:0)

好的,我发现了两个可能的问题。

(1)-spark_apply优先选择具有一个参数的函数,即数据帧

(2) - 你可能需要制作一个包,具体取决于函数的复杂程度。

让我们假设您修改ndcg以接收数据帧作为参数。

ndcg <- function(dataset) { 
     predicted_rank <- dataset$predicted
      actual_rank <- dataset$actual
      # x is a vector of relevance scores 
      DCG <- function(y) y[1] + sum(y[-1]/log(2:length(y), base = 2)) 
      DCG(predicted_rank)/DCG(actual_rank) 
} 

你把它放在一个名为ndcg_package的包中

现在您的代码类似于:

spark_apply(perf_tbl, ndcg, packages = TRUE, names = "ndcg")

从内存中执行此操作,因此可能会有一些拼写错误,但它会让您关闭。