web-dev-qa-db-fra.com

Récupération de valeurs distinctes sur une colonne avec Spark DataFrame

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()  
28
Kazhiyur

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")))
44
Alberto Bonsanto