Scala 如何使用foreachPartition在Spark中高效地为每个分区构建一个ML模型?

Scala 如何使用foreachPartition在Spark中高效地为每个分区构建一个ML模型?,scala,apache-spark,apache-spark-ml,Scala,Apache Spark,Apache Spark Ml,我试图为数据集的每个分区拟合一个ML模型,但我不知道如何在Spark中实现 我的数据集基本上是这样的,是按公司划分的: Company | Features | Target A xxx 0.9 A xxx 0.8 A xxx 1.0 B xxx 1.2 B xxx 1.0 B xxx 0.9 C x

我试图为数据集的每个分区拟合一个ML模型,但我不知道如何在Spark中实现

我的数据集基本上是这样的,是按公司划分的

Company | Features | Target

A         xxx        0.9
A         xxx        0.8
A         xxx        1.0
B         xxx        1.2
B         xxx        1.0
B         xxx        0.9
C         xxx        0.7
C         xxx        0.9
C         xxx        0.9
我的目标是以并行方式为每家公司培训一名回归者(我有数亿条记录,有10万家公司)。 我的直觉是,我需要使用
foreachPartition
并行处理分区(即我的公司),并训练和保存每个公司模型我的主要问题是如何处理
foreachPartition
调用的函数中要使用的
iterator
类型

下面是它的样子:

dd.foreachPartition(
迭代器=>{var company_df=operator.toDF()
var rg=随机森林回归器()
.setLabelCol(“目标”)
.setFeaturesCol(“功能”)
.setNumTrees(10)
var模型=rg.fit(公司财务)
model.write.save(公司路径)
}
)
据我所知,尝试将
迭代器
转换为
数据帧
是不可能的,因为RDD的概念本身不能存在于
foreachPartition
语句中


我知道这个问题很悬而未决,但我真的被卡住了。

在pyspark中,您可以执行以下操作

import statsmodels.api as sm
# df has four columns: id, y, x1, x2

group_column = 'id'
y_column = 'y'
x_columns = ['x1', 'x2']
schema = df.select(group_column, *x_columns).schema

@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
# Input/output are both a pandas.DataFrame
def ols(pdf):
    group_key = pdf[group_column].iloc[0]
    y = pdf[y_column]
    X = pdf[x_columns]
      X = sm.add_constant(X)
    model = sm.OLS(y, X).fit()

    return pd.DataFrame([[group_key] + [model.params[i] for i in   x_columns]], columns=[group_column] + x_columns)

beta = df.groupby(group_column).apply(ols)

如果我切换到PySpark,这将非常有用。Scala Spark?Pandas是一个python库,有一些方法可以使用类似JNI的东西来使用Scala中的等价物,但实现起来会非常复杂。我想说,坚持Pypark将是最干净的解决方案。