PySparkドキュメントから rangeBetween
:
rangeBetween(start, end)
開始(両端を含む)から終了(両端を含む)までのフレーム境界を定義します。
開始と終了はどちらも、現在の行を基準にしています。たとえば、「0」は「現在の行」を意味し、「-1」は現在の行の前に1つオフを意味し、「5」は現在の行の後に5つオフを意味します。
パラメーター:
- start –境界の開始(両端を含む)。これが-sys.maxsize(またはそれ以下)の場合、フレームは無制限です。
- end –境界の両端を含む。これがsys.maxsize(またはそれ以上)の場合、フレームは無制限です。バージョン1.4の新機能。
while rowsBetween
rowsBetween(start, end)
開始(両端を含む)から終了(両端を含む)までのフレーム境界を定義します。
開始と終了はどちらも、現在の行からの相対位置です。たとえば、「0」は「現在の行」を意味し、「-1」は現在の行の前の行を意味し、「5」は現在の行の後の5行目を意味します。
パラメーター:
- start –境界の開始(両端を含む)。これが-sys.maxsize(またはそれ以下)の場合、フレームは無制限です。
- end –境界の両端を含む。これがsys.maxsize(またはそれ以上)の場合、フレームは無制限です。バージョン1.4の新機能。
たとえば、rangeBetween
の場合、「1オフ」は「1行」とどのように異なりますか?
簡単です:
ROWS BETWEEN
は正確な値を気にしません。行の順序のみを考慮し、フレームの計算時に前後の行の数を固定します。RANGE BETWEEN
は、フレームを計算するときに値を考慮します。2つのウィンドウ定義を使用した例を使用してみましょう。
ORDER BY x ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
ORDER BY x RANGE BETWEEN 2 PRECEDING AND CURRENT ROW
およびデータとして
+---+
| x|
+---+
| 10|
| 20|
| 30|
| 31|
+---+
現在の行が最初のウィンドウの値が31の行であるとすると、次の行が含まれます(現在の行とその前の2行)。
+---+----------------------------------------------------+
| x|ORDER BY x ROWS BETWEEN 2 PRECEDING AND CURRENT ROW|
+---+----------------------------------------------------+
| 10| false|
| 20| true|
| 30| true|
| 31| true|
+---+----------------------------------------------------+
そして、次の2つ目(現在のもの、およびx> = 31-2のすべての前のもの):
+---+-----------------------------------------------------+
| x|ORDER BY x RANGE BETWEEN 2 PRECEDING AND CURRENT ROW|
+---+-----------------------------------------------------+
| 10| false|
| 20| false|
| 30| true|
| 31| true|
+---+-----------------------------------------------------+
Java spark docs add clarity: https://spark.Apache.org/docs/2.3.0/api/Java/org /Apache/spark/sql/expressions/WindowSpec.html#rowsBetween-long-long-
rangeBetween
範囲ベースの境界は、ORDER BY式の実際の値に基づいています。オフセットは、ORDER BY式の値を変更するために使用されます。たとえば、現在のorder by式の値が10で、下限のオフセットが-3の場合、現在の行の結果の下限は10-3 =になります。 7.ただし、これはORDER BY式にいくつかの制約を課します。式は1つしか存在できず、この式は数値データ型でなければなりません。値の変更が必要ないため、オフセットが無制限の場合は例外が発生する可能性があります。この場合、複数の非数値のORDER BY式が許可されます。
rowBetween
行ベースの境界は、パーティション内の行の位置に基づいています。オフセットは、現在の行の上または下の行数を示します。現在の行のフレームが開始または終了します。たとえば、下限オフセットが-1で上限オフセットが+2の行ベースのスライドフレームがあるとします。インデックス5の行のフレームは、インデックス4からインデックス6までの範囲になります。
rowsBetween:-rowsBetweenでは、計算する行の境界フレームを定義します。このフレームは個別に計算されます。
rowsBetween内のフレームは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:-rangeBetweenを使用して、計算する行の境界フレームを定義します。これは変更される場合があります。
rowsBetweenのフレームは、orderBy句に依存します。rangeBetweenは、Gordon、Gracie、およびCellieのように、orderBy句で同じ値を持つすべての行を含みます。したがって、現在のフレームに含まれる給与と同じです。
詳細については、以下の例を参照してください:-
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|