尝试填充grouper
列,如下所示。在下表中, X 表示新记录的开始。因此,需要对每个X,Y,Z进行分组。在MySQL中,我会像:
select @x:=1;
update table set grouper=if(column_1='X',@x:=@x+1,@x);
我试图看看是否有办法在不使用循环的情况下执行此操作。用列或类似的东西。
我的尝试:
var group = 1;
val mydf4 = mydf3.withColumn("grouper", when(col("column_1").equalTo("INS"),group=group+1).otherwise(group))
答案 0 :(得分:0)
简单的window
函数和row_number()
内置函数可以为您提供所需的输出
val df = Seq(
Tuple1("X"),
Tuple1("Y"),
Tuple1("Z"),
Tuple1("X"),
Tuple1("Y"),
Tuple1("Z")
).toDF("column_1")
import org.apache.spark.sql.expressions._
def windowSpec = Window.partitionBy("column_1").orderBy("column_1")
import org.apache.spark.sql.functions._
df.withColumn("grouper", row_number().over(windowSpec)).orderBy("grouper", "column_1").show(false)
应该给你
+--------+-------+
|column_1|grouper|
+--------+-------+
|X |1 |
|Y |1 |
|Z |1 |
|X |2 |
|Y |2 |
|Z |2 |
+--------+-------+
注意:最后一个orderBy只是为了匹配预期的输出,只是为了可视化。在真实的集群和处理顺序中,这样做没有意义