填充" Grouper"在scala.spark数据帧中使用.withcolumn的列

时间:2018-06-16 03:31:45

标签: scala apache-spark

尝试填充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))

enter image description here

Example DF

1 个答案:

答案 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只是为了匹配预期的输出,只是为了可视化。在真实的集群和处理顺序中,这样做没有意义