Scala 如何使用foreachPartition在Spark中高效地为每个分区构建一个ML模型?
我试图为数据集的每个分区拟合一个ML模型,但我不知道如何在Spark中实现 我的数据集基本上是这样的,是按公司划分的: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
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将是最干净的解决方案。