Utilisation de Spark version 1.6.1) Je dois extraire des valeurs distinctes sur une colonne, puis effectuer une transformation spécifique par-dessus celle-ci. La colonne contient plus de 50 millions d'enregistrements et peut s'agrandir.
Je comprends que faire un distinct.collect()
ramènera l'appel au programme du pilote. Actuellement, j'effectue cette tâche comme indiqué ci-dessous. Y a-t-il une meilleure approche?
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()
Bien pour obtenir toutes les différentes valeurs dans un Dataframe
, vous pouvez utiliser distinct . Comme vous pouvez le constater dans la documentation, cette méthode retourne un autre DataFrame
. Après cela, vous pouvez créer un UDF
afin de transformer chaque enregistrement.
Par exemple:
val df = sc.parallelize(Array((1, 2), (3, 4), (1, 6))).toDF("age", "salary")
// I obtain all different values. If you show you must see only {1, 3}
val distinctValuesDF = df.select(df("age")).distinct
// Define your udf. In this case I defined a simple function, but they can get complicated.
val myTransformationUDF = udf(value => value / 10)
// Run that transformation "over" your DataFrame
val afterTransformationDF = distinctValuesDF.select(myTransformationUDF(col("age")))