我有一个train
和test
数据集,具有特征和数千个customerId
值。
我的目标是在Spark中每xgboost
同时训练一个二进制customerId
分类器。
我本质上是在尝试做此thread中的发帖人所要问的问题,但要使用Scala而不是PySpark。 通过阅读,我了解到答案在下面的document中给出了,但是我不确定如何实现。 Spark的Job Scheduling文档告诉我,我需要从单独的线程启动每个模型的训练。
到目前为止,我的代码看起来像这样:
// Data
val train: DataFrame = ...
val test: DataFrame = ...
// Model
val xgbClassifier: XGBoostClassifier = ...
// List of unique customerId's
val customers: List[Int] = ...
// Function for training and predicting for a given customer
def trainAndPredict(customer: Int): DataFrame = {
val train_subset = train.filter($"customerId" === customer)
val test_subset = test.filter($"customerId" === customer)
...
}
// Recursively train and predict for all customers
@tailrec
final def recTrainAndPredict(customers: List[Int], acc: DataFrame): DataFrame = customers match {
case Nil => acc
case x :: xs => recTrainAndPredict(xs, acc.union(trainAndPredict(x)))
}
val result = recTrainAndPredict(customers, spark.emptyDataFrame)
代码可以运行,但是我猜想是通过将小的数据集分布在不同的节点上浪费了很多时间。
如何在不同节点上分配作业,如何在不牺牲时间的情况下同时运行trainAndPredict
的不同调用?