У меня есть набор данных train
и test
с функциями и несколькими тысячами значений customerId
.Моя цель состоит в том, чтобы одновременно обучить один двоичный xgboost
классификатор на customerId
в Spark.
Я, по сути, пытаюсь сделать то, о чем спрашивает плакат в этой теме , но вСкала вместо PySpark.Из прочтения я понимаю, что ответ дается в следующем документе , но я не уверен, как его реализовать.Документация по планированию заданий для Spark сообщает мне, что мне нужно инициировать обучение каждой модели из отдельных потоков.
Пока мой код выглядит примерно так:
// 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
, не жертвуя временем, распределяя работу по разным узлам?