Pyspark数据转换逻辑将一个列值分配给另一个

时间:2017-08-01 03:55:46

标签: hadoop apache-spark pyspark transformation

我正在使用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

请提前帮助我解决此问题

1 个答案:

答案 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|
+---+---+---+

希望这有帮助!