web-dev-qa-db-fra.com

spark sql window function lag

Je regarde la fonction de diapositive de fenêtre pour un Spark DataFrame dans Spark SQL, Scala.

J'ai une trame de données avec les colonnes Col1, Col1, Col1, date.

Col1    Col2    Col3    date     volume new_col
                        201601  100.5   
                        201602  120.6   100.5
                        201603  450.2   120.6
                        201604  200.7   450.2
                        201605  121.4   200.7`

Maintenant, je veux ajouter une nouvelle colonne avec le nom (new_col) avec une ligne glissée vers le bas, comme indiqué ci-dessus.

J'ai essayé l'option ci-dessous pour utiliser la fonction fenêtre.

val windSldBrdrxNrx_df = df.withColumn("Prev_brand_rx", lag("Prev_brand_rx",1))

Quelqu'un peut-il m'aider à faire cela.

13
Ramesh

Vous faites correctement tout ce que vous avez manqué est over(window expression) sur lag

val df = sc.parallelize(Seq((201601, 100.5),
  (201602, 120.6),
  (201603, 450.2),
  (201604, 200.7),
  (201605, 121.4))).toDF("date", "volume")

val w = org.Apache.spark.sql.expressions.Window.orderBy("date")  

import org.Apache.spark.sql.functions.lag

val leadDf = df.withColumn("new_col", lag("volume", 1, 0).over(w))

leadDf.show()

+------+------+-------+
|  date|volume|new_col|
+------+------+-------+
|201601| 100.5|    0.0|
|201602| 120.6|  100.5|
|201603| 450.2|  120.6|
|201604| 200.7|  450.2|
|201605| 121.4|  200.7|
+------+------+-------+

Ce code a été exécuté sur Spark Shell 2.0.2

26
mrsrinivas

Vous pouvez importer ci-dessous deux packages, ce qui résoudra le problème des dépendances de décalage.

import org.Apache.spark.sql.functions.{lead, lag}
import org.Apache.spark.sql.expressions.Window
2
Sampat Kumar