rowsbetween和rangebetween之间有什么区别?

aamkag61  于 2021-07-14  发布在  Spark
关注(0)|答案(4)|浏览(681)

从Pypark医生那里 rangeBetween : rangeBetween(start, end) 定义从开始(包含)到结束(包含)的帧边界。
开始和结束都是相对于当前行的。例如,“0”表示“当前行”,而“-1”表示当前行之前的一个关,“5”表示当前行之后的五个关。
参数:
开始–边界开始,包括在内。如果该帧为-sys.maxsize(或更低),则该帧是无界的。
结束-边界结束,包括在内。如果这是sys.maxsize(或更高),则帧是无界的。版本1.4中的新功能。

rowsBetween rowsBetween(start, end) 定义从开始(包含)到结束(包含)的帧边界。
起点和终点都是当前行的相对位置。例如,“0”表示“当前行”,“1”表示当前行之前的行,“5”表示当前行之后的第五行。
参数:
开始–边界开始,包括在内。如果该帧为-sys.maxsize(或更低),则该帧是无界的。
结束-边界结束,包括在内。如果这是sys.maxsize(或更高),则帧是无界的。版本1.4中的新功能。
为了 rangeBetween 例如,“1关”与“1行”有何不同?

ki0zmccv

ki0zmccv1#

很简单: ROWS BETWEEN 不关心确切的值。它只关心行的顺序,在计算帧时取固定的前后行数。 RANGE BETWEEN 计算帧时考虑值。
让我们使用一个使用两个窗口定义的示例:
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的行,则将包括以下行(当前行和前两行):

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

对于后面的第二个(当前的和所有前面的,其中x>=31-2):

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

carvr3hs2#

java spark文档更加清晰:https://spark.apache.org/docs/2.3.0/api/java/org/apache/spark/sql/expressions/windowspec.html#rowsbetween-长的长的-
范围介于
基于范围的边界基于order by表达式的实际值。偏移量用于更改order by表达式的值,例如,如果当前order by表达式的值为10,并且下限偏移量为-3,则当前行的结果下限将为10-3=7。但是,这会对order by表达式施加许多约束:只能有一个表达式,并且该表达式必须具有数字数据类型。偏移量为无界时会出现异常,因为不需要修改值,在这种情况下,允许使用多个和非数字的order by表达式。
划船
基于行的边界基于行在分区中的位置。偏移量表示当前行上方或下方的行数,当前行的帧开始或结束。例如,给定一个基于行的滑动帧,其下限偏移量为-1,上限偏移量为+2。索引为5的行的帧的范围从索引4到索引6。

wxclj1h5

wxclj1h53#

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,可以定义要计算的行的边界框,该边界框可能会更改。
rangebetween中的框架依赖于orderby子句。rangebetween将包含orderby子句中具有相同值的所有行,如gordon、gracie和cellie具有相同的薪水,因此包含在当前帧中。
有关更多了解,请参见以下示例:-

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|
55ooxyrt

55ooxyrt4#

rangebetween查看order by子句以确定窗口中是否包含行。
rowsbetween查看行的顺序。
检查之间的范围如果order by在某个指定的范围内,则将在窗口中包含它们。
rowsbetween将根据当前行周围的行位置形成窗口(不考虑这些行的order by列的值)

相关问题