在SparkR

时间:2015-10-22 16:32:05

标签: sparkr

我目前正在尝试使用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类强制转换为向量"

我能以某种方式这样做吗?

2 个答案:

答案 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代码

  1. 定义架构

      structField("product_id", "integer"),
      structField("audit_date", "date"),
      structField("holt_unit_forecast", "double"),
      structField("holt_unit_forecast_std", "double")
    )
    
    
  2. 执行方法

      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