![](/img/trans.png)
[英]How can one get sparklyr::spark_apply() to spawn more than one worker?
[英]apply UDF with more than one argument in spark_apply() function 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
它在 force 语句中给了我很长的错误/未使用的参数
如何解决这个问题?
它在 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)
可能是其他一些问题。
要添加到 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.