применять UDF с более чем одним аргументом в функции sparklyr spark_apply () - PullRequest
0 голосов
/ 07 июня 2018

У меня есть функция 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

это дает мне длинную ошибку / неиспользуемый параметр в операторе force

Как решить эту проблему?

1 Ответ

0 голосов
/ 07 июня 2018

это дает мне длинную ошибку / неиспользуемый параметр в операторе force

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)
    
  • Возможно, некоторые другие проблемы.

...