我目前正在尝试使用sparkR版本1.5.1实现一些功能。我见过较旧的(版本1.3)示例,其中人们在DataFrame上使用了apply函数,但看起来它不再直接可用。示例:
x = c(1,2)
xDF_R = data.frame(x)
colnames(xDF_R) = c("number")
xDF_S = createDataFrame(sqlContext,xDF_R)
现在,我可以在data.frame对象上使用sapply函数
xDF_R$result = sapply(xDF_R$number, ppois, q=10)
当我在DataFrame上使用类似的逻辑时
xDF_S$result = sapply(xDF_S$number, ppois, q=10)
我收到错误消息" as.list.default(X)出错: 没有方法可以将这个S4类强制转换为向量"
我能以某种方式这样做吗?
答案 0 :(得分:0)
这可以使用user defined functions in Spark 2.0。
wrapper = function(df){
+ out = df
+ out$result = sapply(df$number, ppois, q=10)
+ return(out)
+ }
> xDF_S2 = dapplyCollect(xDF_S, wrapper)
> identical(xDF_S2, xDF_R)
[1] TRUE
注意你需要一个像这样的包装器函数,因为你不能直接传递额外的参数,但是将来可能会改变。
答案 1 :(得分:0)
本机R函数不支持Spark DataFrame。我们可以使用user defined functions in SparkR执行本机R模块。这些在执行程序上执行,因此这些库必须在所有执行程序上都可用。
例如,假设我们有一个自定义函数holt_forecast
,该函数以data.table作为参数。
R代码示例
sales_R_df %>%
group_by(product_id) %>%
do(holt_forecast(data.table(.))) %>%
data.table(.) -> dt_holt
对于使用UDF,我们需要指定通过执行本机R方法返回的输出data.frame的模式。 Spark使用此架构来生成Spark DataFrame。
等效的SparkR代码
定义架构
structField("product_id", "integer"),
structField("audit_date", "date"),
structField("holt_unit_forecast", "double"),
structField("holt_unit_forecast_std", "double")
)
执行方法
library(data.table)
library(lubridate)
library(dplyr)
library(forecast)
sales <- data.table(x)
y <- data.frame(key,holt_forecast(sales))
}, dt_holt_schema)
参考:https://shbhmrzd.medium.com/stl-and-holt-from-r-to-sparkr-1815bacfe1cc