sparklyr中基于lab分组并行训练ml_linear_regression模型的问题求助
sparklyr中基于lab分组并行训练ml_linear_regression模型的问题求助
嗨,我来帮你排查这个问题~你遇到的报错主要是因为spark_apply的工作机制和你使用的ml_linear_regression不兼容,咱们一步步理清楚:
为什么你的代码会报错?
spark_apply在执行时,会把每个lab分组的数据转换成本地R数据框(不是Spark DataFrame)传到Worker节点处理,但ml_linear_regression是Spark MLlib的API,它只能操作Spark DataFrame,没办法直接处理本地的R数据框,这就导致了Job执行失败。
解决方案:用R原生的线性回归函数配合spark_apply
既然每个分组拿到的是本地R数据框,咱们直接用R原生的lm()函数来训练回归模型就可以了,这样完全适配spark_apply的运行环境,还能实现并行处理。修改后的代码如下:
# 构造示例数据 df = data.frame( "x"=c(1, 2, 3, 1, 2, 3), "y"=c(1, 2, 3, 2, 4, 6), "lab" = c("a", "a", "a", "b", "b", "b") ) # 复制到Spark sdf_df = sdf_copy_to(sc, df, overwrite = TRUE) # 修改分组处理函数:用R本地lm训练并预测 fit_part = function(df){ # 用R原生lm训练线性回归模型 model = lm(y ~ x, data = df) # 生成预测值并添加到原数据框 df$predicted_y = predict(model, df) # 返回包含原数据和预测结果的数据集 return(df) } # 执行分组并行处理 result = spark_apply(sdf_df, fit_part, group_by = "lab") # 查看结果 collect(result)
运行这段代码后,你会得到每个分组的原始数据加上对应的预测值,完全实现了按lab并行训练回归模型的需求。
额外说明
如果你的分组数据量特别大,超出了单个Worker节点的内存承受范围,那可能需要更复杂的分布式处理方案,但Spark MLlib本身并没有原生支持按组的分布式回归训练,这种情况下你可能需要自定义Spark ML Estimator,不过复杂度会高很多。对于大多数场景,上面的方法已经足够高效且易用了。
备注:内容来源于stack exchange,提问作者Giacomo Marcon
相关产品推荐
相关产品推荐

