Я раньше, когда надо было добавить поля, не парясь делал foldLeft коллекции новых и оборачивал старые датафреймы в n полей. Ни разу не было проблем и чистый функциональный код
А такой вопрос ещё: спарковый оптимизатор то, наверное, какое-то время должен потратить, чтобы соптимизировать кучу withColumn’ов в один project. Ну и на 10-20 это, наверное, не будет заметно, но насчёт 100+ я чота не уверен.