Scala Spark基于dataframe中的另一列递增一列,不带for循环
我有一个像下面这样的数据帧。我需要一个名为cutofftype的新列,它不是当前单调递增的数字,而是在ID列每次更改时重置为1 df=df.orderBy(“ID”,“date”)。带列(“截止类型”,单调递增的\u ID()+1) 目标如下:Scala Spark基于dataframe中的另一列递增一列,不带for循环,scala,apache-spark,Scala,Apache Spark,我有一个像下面这样的数据帧。我需要一个名为cutofftype的新列,它不是当前单调递增的数字,而是在ID列每次更改时重置为1 df=df.orderBy(“ID”,“date”)。带列(“截止类型”,单调递增的\u ID()+1) 目标如下: +------+---------------+----------+ | ID | date |cutofftype| +------+---------------+----------+ | 54441| 2016-0
+------+---------------+----------+
| ID | date |cutofftype|
+------+---------------+----------+
| 54441| 2016-06-20| 1|
| 54441| 2016-06-27| 2|
| 54441| 2016-07-04| 3|
| 54441| 2016-07-11| 4|
| 54500| 2016-05-02| 1|
| 54500| 2016-05-09| 2|
| 54500| 2016-05-16| 3|
| 54500| 2016-05-23| 4|
| 54500| 2016-06-06| 5|
| 54500| 2016-06-13| 6|
+------+---------------+----------+
我知道这可以通过for循环来实现-我想在没有for循环的情况下实现>>有办法吗?简单的按问题划分。您应该使用
窗口
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy("ID").orderBy("date")
df.withColumn("cutofftype", row_number().over(w)).show()
+-----+----------+----------+
| ID| date|cutofftype|
+-----+----------+----------+
|54500|2016-05-02| 1|
|54500|2016-05-09| 2|
|54500|2016-05-16| 3|
|54500|2016-05-23| 4|
|54500|2016-06-06| 5|
|54500|2016-06-13| 6|
|54441|2016-06-20| 1|
|54441|2016-06-27| 2|
|54441|2016-07-04| 3|
|54441|2016-07-11| 4|
+-----+----------+----------+
import org.apache.spark.sql.expressions.Window
val w = Window.partitionBy("ID").orderBy("date")
df.withColumn("cutofftype", row_number().over(w)).show()
+-----+----------+----------+
| ID| date|cutofftype|
+-----+----------+----------+
|54500|2016-05-02| 1|
|54500|2016-05-09| 2|
|54500|2016-05-16| 3|
|54500|2016-05-23| 4|
|54500|2016-06-06| 5|
|54500|2016-06-13| 6|
|54441|2016-06-20| 1|
|54441|2016-06-27| 2|
|54441|2016-07-04| 3|
|54441|2016-07-11| 4|
+-----+----------+----------+