2017-02-12 1 views
0

Comment effectuer une itération sur un DataSet dans Spark 2.0 et scala? Mon problème est - j'ai besoin de comparer deux lignes. Je dois comparer DateN et DateN-1 et calculer la différence.Iterators avec DataSet dans Spark 2.0

Row1 - Date1 Num1 
Row2 - Date2 Num2 
.. 
RowN- DateN NumN 
+0

Votre df contient seulement deux lignes? Si non, que voulez-vous répondre exactement au vu des données? pls élaborer plus sur le problème car il existe des méthodes planty disponibles –

+0

Non. C'est juste un exemple. Ma DS a beaucoup de lignes. Comme je l'ai mentionné ci-dessus, j'ai besoin de comparer deux dates de deux rangées dans une itération dans Scala et trouver leur différence. –

+0

Vous voulez des "fonctions de fenêtre". Voir, par exemple, https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html –

Répondre

0

Je ne sais pas, si vous émettez résolu en utilisant la fonction de fenêtre que vous voulez juste de comparer n & n-1 lignes et je ne vois pas l'attribut sur lequel vous voulez regrouper les données. Pour votre besoin décrit, vous pouvez résoudre le problème comme suit:

  1. Ajoutez l'index à la commande rdd à l'aide de zipWithIndex.
  2. Créer rdd pour les lignes indexées impaires.
  3. Créer rdd pour des lignes d'index paires.
  4. Maintenant, vous pouvez appliquer votre logique sur deux rdds.1

est l'exemple Après travail:

val spark = SparkSession 
        .builder 
        .appName("Example") 
        .master("local[*]") 
        .getOrCreate() 
        import spark.implicits._ 
    val customers = spark.sparkContext.parallelize(List(("Alice", "2016-05-01", 50.00), 
             ("Alice", "2016-05-03", 45.00), 
             ("Alice", "2016-05-04", 55.00), 
             ("Bob", "2016-05-01", 25.00), 
             ("Bob", "2016-05-04", 29.00), 
             ("Bob", "2016-05-06", 27.00))) 

    val custIndexed = customers.zipWithIndex().collect() 
    val custOdd = custIndexed.filter(record=>record._2%2!=0) 
    val custEven = custIndexed.filter(record=>record._2%2==0) 
+0

J'ai été capable de résoudre en utilisant les fonctions de la fenêtre. Je vous remercie ! –