Maison >base de données >tutoriel mysql >Comment simuler la fonction `ROW_NUMBER()` de SQL dans Spark RDD ?

Comment simuler la fonction `ROW_NUMBER()` de SQL dans Spark RDD ?

DDD
DDDoriginal
2024-12-22 09:41:57735parcourir

How to Simulate SQL's `ROW_NUMBER()` Function in Spark RDD?

Numéro de ligne SQL équivalent dans Spark RDD

Dans Spark, obtention d'un numéro de ligne équivalent au row_number() de SQL sur (partition par .. . order by ...) pour un RDD peut être réalisé en utilisant la version améliorée de Spark 1.4. fonctionnalité.

Solution :

  1. Créer un RDD de test :
val sample_data = Seq(((3, 4), 5, 5, 5),
((3, 4), 5, 5, 9),
((3, 4), 7, 5, 5),
((1, 2), 1, 2, 3),
((1, 2), 1, 4, 7),
((1, 2), 2, 2, 3))

val temp1 = sc.parallelize(sample_data)
  1. Partition par clé et Ordre :

Utilisez la fonction rowNumber() introduite dans Spark 1.4 pour créer une fenêtre partitionnée :

import org.apache.spark.sql.expressions.Window

val partitionedRdd = temp1
  .map(x => (x._1, x._2._1, x._2._2, x._2._3))
  .groupBy(_._1)
  .mapGroups((_, entries) =>
    entries.toList
      .sortBy(x => (x._2, -x._3, x._4))
      .zipWithIndex
      .map(x => (x._1._1, x._1._2, x._1._3, x._1._4, x._2 + 1))
  )
  1. Sortez le résultat :
partitionedRdd.foreach(println)

// Example output:
// ((1,2),1,4,7,1)
// ((1,2),1,2,3,2)
// ((1,2),2,2,3,3)
// ((3,4),5,5,5,4)
// ((3,4),5,5,9,5)
// ((3,4),7,5,5,6)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn