web-dev-qa-db-ja.com

rowsBetweenとrangeBetweenの違いは何ですか?

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行」とどのように異なりますか?

24
Evan Zamir

簡単です:

  • 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|
+---+-----------------------------------------------------+
29
zero323

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までの範囲になります。

4
Peter

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|
1
Akash Saini