spark scala转换数据帧/rdd
我有一个CSV文件,如下所示spark scala转换数据帧/rdd,scala,apache-spark,Scala,Apache Spark,我有一个CSV文件,如下所示 PK,key,Value 100,col1,val11 100,col2,val12 100,idx,1 100,icol1,ival11 100,icol3,ival13 100,idx,2 100,icol1,ival21 100,icol2,ival22 101,col1,val21 101,col2,val22 101,idx,1 101,icol1,ival11 101,icol3,ival13 101,idx,3 101,icol1,ival31 101
PK,key,Value
100,col1,val11
100,col2,val12
100,idx,1
100,icol1,ival11
100,icol3,ival13
100,idx,2
100,icol1,ival21
100,icol2,ival22
101,col1,val21
101,col2,val22
101,idx,1
101,icol1,ival11
101,icol3,ival13
101,idx,3
101,icol1,ival31
101,icol2,ival32
我想将此转换为以下内容
PK,idx,key,Value
100,,col1,val11
100,,col2,val12
100,1,idx,1
100,1,icol1,ival11
100,1,icol3,ival13
100,2,idx,2
100,2,icol1,ival21
100,2,icol2,ival22
101,,col1,val21
101,,col2,val22
101,1,idx,1
101,1,icol1,ival11
101,1,icol3,ival13
101,3,idx,3
101,3,icol1,ival31
101,3,icol2,ival32
基本上,我想在输出数据框中创建一个名为idx的新列,该列将填充与key=idx,value=“n”后面的行相同的值“n” 这里有一种使用Spark>=2.0.0的
last
窗口功能的方法:
import org.apache.spark.sql.functions.{last,when,lit}
导入org.apache.spark.sql.expressions.Window
val w=窗口之间的Window.partitionBy(“PK”).rowsBetween(Window.unbounddpreceiding,0)
df.withColumn(“idx”,当($“key”==点亮(“idx”),$“Value”))
.withColumn(“idx”,last($“idx”,true)。超过(w))
.orderBy($“PK”)
显示
输出:
+---+-----+------+----+
| PK| key| Value| idx|
+---+-----+------+----+
|100| col1| val11|null|
|100| col2| val12|null|
|100| idx| 1| 1|
|100|icol1|ival11| 1|
|100|icol3|ival13| 1|
|100| idx| 2| 2|
|100|icol1|ival21| 2|
|100|icol2|ival22| 2|
|101| col1| val21|null|
|101| col2| val22|null|
|101| idx| 1| 1|
|101|icol1|ival11| 1|
|101|icol3|ival13| 1|
|101| idx| 3| 3|
|101|icol1|ival31| 3|
|101|icol2|ival32| 3|
+---+-----+------+----+
代码首先创建一个名为
idx
的新列,当key==idx
或null
时,该列包含value
的值。然后在定义的窗口上检索last
observedidx
酷。谢谢,很好用。出于某种原因,$“column\u name”对我不起作用,但col(“column\u name”)可以很好地工作。