在spark_apply()函数sparklyr

时间:2018-06-07 10:05:46

标签: r dplyr user-defined-functions sparklyr

我有一个带有多个参数的R函数,并在其中使用了dplyr函数。

现在,我想将此UDF应用于火花数据框。

示例代码

myfun=function(objdf,x,y,k){

  f <- function(x1,y1,x2,y2) {
    d=(x2-x1) + (y2-y1)
  }
  search=function(df,x,y,k){
    df1=data.frame(cbind(df,f(x,y,df$xx,df$yy)))
    colnames(df1)=c(colnames(df),"val")
    colnames(df1)
    new_df=df1 %>% arrange(val) %>% head(k)
    return(new_df)
  }

  searchwithk <- function(x,y,k) {
    force(x,y,k);
    function(df) search(df,x,y,k)
  }

  res <- spark_apply(objdf, function(df) {
    searchwithk(df,x,y,k)
  })
  return(res)
}

#df= spark_dataframe
x=12.12
y=-74.5
k=5
result=myfun(df,x,y,k)
result

它在强制语句中给出了长错误/未使用的参数

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

  

它在强制语句中给出了长错误/未使用的参数

force是一元函数。您不能一次传递多个参数:

searchwithk <- function(x,y,k) {
  force(x)
  force(y)
  force(k)
  function(df) search(df,x,y,k)
}

此外:

  • f函数不返回任何内容。应该是

    f  <- function(x1,y1,x2,y2) {
      (x2-x1) + (y2-y1)
    }
    
  • dplyr方法将在闭包中超出范围。你可能需要

    search=function(df,x,y,k){
       library(dplyr)
       ...
    }
    
  • 您错误地调用searchwithk并使用了错误的对象。应该是

    searchwithk(x,y,k)(df)
    
  • 可能还有其他一些问题。

答案 1 :(得分:0)

要添加到 user9908499 的答案中,您可以通过使用上下文参数传入值列表,有效地将任意数量的参数传递给双参数函数。

例如

searchwithk <- function(df, context) # these two parameters are the only two you should need
{
    library(dplyr) # put any other libraries you need here
    x <- context$x; y <- context$y; k <- context$k
    function(df) search(df,x,y,k) # or whatever you want your code to be
}

res <- df %>% spark_apply(searchwithk,
  context = list(x = x, y = y, k = k)) # put as much as you want in this context