我正在使用spark 2.1.0。我有如下所述的数据帧。我对pyspark很新,我对这个问题感到困惑
现在问题陈述是:考虑到b列我应该从引用到列a i填充C列,e对于来自列a的每4个值,必须使用参考列b中的值来填充列c。例如,如下面的行数no:4中的数据帧所示,等效c值为30。该30已从b列获得,其等价物a为1
以下是我的原始数据框
a b
0 0
1 30
2 18
3 10
4 5
5 1
1 8
2 6
3 9
4 3
5 4
1 2
2 18
3 2
4 1
5 15
结果数据框应如下所示:
a b c
0 0 0
1 30 0
2 18 0
3 10 0
4 5 30
5 1 18
1 8 10
2 6 5
3 9 1
4 3 8
5 4 6
1 2 9
2 18 3
3 2 4
4 1 2
5 15 18
请提前帮助我解决此问题
答案 0 :(得分:1)
您可以使用lag功能获取上一行
import spark.implicits._
val df1 = Seq (
(0, 0),
(1, 30),
(2, 18),
(3, 10),
(4, 5),
(5, 1),
(1, 8),
(2, 6),
(3, 9),
(4, 3),
(5, 4),
(1, 2),
(2, 18),
(3, 2),
(4, 1),
(5, 15)
).toDF("a", "b")
df1.show()
df1.withColumn("id", monotonically_increasing_id())
.withColumn("c", lag($"b", 3, 0).over(Window.orderBy("id")))
.drop("id")
.show()
输出:
+---+---+---+
| a| b| c|
+---+---+---+
| 0| 0| 0|
| 1| 30| 0|
| 2| 18| 0|
| 3| 10| 0|
| 4| 5| 30|
| 5| 1| 18|
| 1| 8| 10|
| 2| 6| 5|
| 3| 9| 1|
| 4| 3| 8|
| 5| 4| 6|
| 1| 2| 9|
| 2| 18| 3|
| 3| 2| 4|
| 4| 1| 2|
| 5| 15| 18|
+---+---+---+
希望这有帮助!