Obteniendo valores distintos en una columna usando Spark DataFrame

Al usar la versión 1.6.1 de Spark, necesito obtener valores distintos en una columna y luego realizar alguna transformación específica encima. La columna contiene más de 50 millones de registros y puede crecer más.
Entiendo que hacer undistinct.collect() devolverá la llamada al programa del controlador. Actualmente estoy realizando esta tarea de la siguiente manera, ¿hay un mejor enfoque?

 import sqlContext.implicits._
 preProcessedData.persist(StorageLevel.MEMORY_AND_DISK_2)

 preProcessedData.select(ApplicationId).distinct.collect().foreach(x => {
   val applicationId = x.getAs[String](ApplicationId)
   val selectedApplicationData = preProcessedData.filter($"$ApplicationId" === applicationId)
   // DO SOME TASK PER applicationId
 })

 preProcessedData.unpersist()  

Respuestas a la pregunta(1)

Su respuesta a la pregunta