web-dev-qa-db-fra.com

Quelle est la différence entre rowBetween et rangeBetween?

Depuis les documents PySpark rangeBetween :

rangeBetween(start, end)

Définit les limites du cadre, du début (inclus) à la fin (inclus).

Le début et la fin sont relatifs par rapport à la ligne actuelle. Par exemple, "0" signifie "ligne actuelle", tandis que "-1" signifie un arrêt avant la ligne actuelle et "5" signifie les cinq arrêtés après la ligne actuelle.

Paramètres:

  • start - début de limite, inclus. Le cadre est illimité s'il s'agit de -sys.maxsize (ou inférieur).
  • extrémité - extrémité limite, inclus. Le cadre est illimité s'il s'agit de sys.maxsize (ou supérieur). Nouveau dans la version 1.4.

tandis que rowsBetween

rowsBetween(start, end)

Définit les limites du cadre, du début (inclus) à la fin (inclus).

Le début et la fin sont des positions relatives de la ligne actuelle. Par exemple, "0" signifie "ligne actuelle", tandis que "-1" signifie la ligne avant la ligne actuelle et "5" signifie la cinquième ligne après la ligne actuelle.

Paramètres:

  • start - début de limite, inclus. Le cadre est illimité s'il s'agit de -sys.maxsize (ou inférieur).
  • extrémité - extrémité limite, inclus. Le cadre est illimité s'il s'agit de sys.maxsize (ou supérieur). Nouveau dans la version 1.4.

Pour rangeBetween en quoi "1 off" est-il différent de "1 row", par exemple?

24
Evan Zamir

C'est simple:

  • ROWS BETWEEN ne se soucie pas des valeurs exactes. Il ne se soucie que de l'ordre des lignes et prend un nombre fixe de lignes précédentes et suivantes lors du calcul de la trame.
  • RANGE BETWEEN prend en compte les valeurs lors du calcul de la trame.

Prenons un exemple utilisant deux définitions de fenêtre:

  • ORDER BY x ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
  • ORDER BY x RANGE BETWEEN 2 PRECEDING AND CURRENT ROW

et les données

+---+
|  x|
+---+
| 10|
| 20|
| 30|
| 31|
+---+

En supposant que la ligne actuelle est celle avec la valeur 31 pour la première fenêtre, les lignes suivantes seront incluses (une actuelle et deux précédentes):

+---+----------------------------------------------------+
|  x|ORDER BY x ROWS BETWEEN 2  PRECEDING AND CURRENT ROW|
+---+----------------------------------------------------+
| 10|                                               false|
| 20|                                                true|
| 30|                                                true|
| 31|                                                true|
+---+----------------------------------------------------+

et pour le second suivant (actuel, et tous précédents où x> = 31 - 2):

+---+-----------------------------------------------------+
|  x|ORDER BY x RANGE BETWEEN 2  PRECEDING AND CURRENT ROW|
+---+-----------------------------------------------------+
| 10|                                                false|
| 20|                                                false|
| 30|                                                 true|
| 31|                                                 true|
+---+-----------------------------------------------------+
29
zero323

Les documents Java spark ajoutent de la clarté: https://spark.Apache.org/docs/2.3.0/api/Java/org /Apache/spark/sql/expressions/WindowSpec.html#rowsBetween-long-long-

rangeBetween

Une limite basée sur une plage est basée sur la valeur réelle des expressions ORDER BY. Un décalage est utilisé pour modifier la valeur de l'expression ORDER BY, par exemple si l'expression par ordre en cours a une valeur de 10 et que le décalage de limite inférieure est -3, la limite inférieure résultante pour la ligne actuelle sera 10 - 3 = 7. Cela impose cependant un certain nombre de contraintes aux expressions ORDER BY: il ne peut y avoir qu'une seule expression et cette expression doit avoir un type de données numérique. Une exception peut être faite lorsque l'offset est illimité, car aucune modification de valeur n'est nécessaire, dans ce cas, l'expression ORDER BY multiple et non numérique est autorisée.

rowBetween

Une limite basée sur une ligne est basée sur la position de la ligne dans la partition. Un décalage indique le nombre de lignes au-dessus ou au-dessous de la ligne actuelle, le cadre de la ligne actuelle commence ou se termine. Par exemple, étant donné un cadre coulissant basé sur une ligne avec un décalage de limite inférieure de -1 et un décalage de limite supérieure de +2. Le cadre de la ligne avec l'index 5 serait compris entre l'index 4 et l'index 6.

4
Peter

rowBetween: - Avec rowsBetween, vous définissez un cadre limite de lignes à calculer, lequel cadre est calculé indépendamment.

Le cadre dans rowBetween ne dépend pas de la clause orderBy.

df = spark.read.csv(r'C:\Users\akashSaini\Desktop\TT.csv',inferSchema =True, header=True).na.drop()
w =Window.partitionBy('DEPARTMENT').orderBy('SALARY').rowsBetween(Window.unboundedPreceding,Window.currentRow)
df.withColumn('RowsBetween', F.sum(df.SALARY).over(w)).show()


first_name|Department|Salary|RowsBetween|

 Sofia|     Sales| 20000| 20000|
Gordon|     Sales| 25000| 45000|
Gracie|     Sales| 25000| 70000|
Cellie|     Sales| 25000| 95000|
Jervis|     Sales| 30000|125000|
 Akash|  Analysis| 30000| 30000|
Richard|   Account| 12000| 12000|
 Joelly|   Account| 15000| 27000|
Carmiae|   Account| 15000| 42000|
    Bob|   Account| 20000| 62000|
  Gally|   Account| 28000| 90000

rangeBetween: - Avec rangeBetween, vous définissez un cadre de limite de lignes à calculer, qui peut changer.

Le cadre dans rowBetween dépend de la clause orderBy. RangeBetween inclura toutes les lignes qui ont la même valeur dans la clause orderBy comme Gordon, Gracie et Cellie ont le même salaire, donc inclus dans le cadre actuel.

Pour plus de compréhension, voir l'exemple ci-dessous: -

df = spark.read.csv(r'C:\Users\asaini28.EAD\Desktop\TT.csv',inferSchema =True, header=True).na.drop()
w =Window.partitionBy('DEPARTMENT').orderBy('SALARY').rangeBetween(Window.unboundedPreceding,Window.currentRow)
df.withColumn('RangeBetween', F.sum(df.SALARY).over(w)).select('first_name','Department','Salary','Test').show()

 first_name|Department|Salary|RangeBetween|
  Sofia|     Sales| 20000| 20000|
 Gordon|     Sales| 25000| 95000|
 Gracie|     Sales| 25000| 95000|
 Cellie|     Sales| 25000| 95000|
 Jervis|     Sales| 30000|125000|
  Akash|  Analysis| 30000| 30000|
Richard|   Account| 12000| 12000|
 Joelly|   Account| 15000| 42000|
Carmiae|   Account| 15000| 42000|
    Bob|   Account| 20000| 62000|
  Gally|   Account| 28000| 90000|
1
Akash Saini