pyspark数据转换逻辑,用于将一列值分配给另一列

bf1o4zei  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(364)

我正在使用spark 2.1.0。我有下面提到的Dataframe。我是pyspark的新手,我对这个问题很感兴趣
现在的问题是:考虑到b列,我应该从a列的引用填充c列,即对于a列的每4个值,c列必须用b列的引用值填充。例如,如下图所示,第4行的dataframe等效c值为30。这30是从b列得到的,b列的当量a为1
下面是我的原始Dataframe

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

结果Dataframe应如下所示:

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

请帮我解决这个问题,谢谢

u2nhd7ah

u2nhd7ah1#

您可以使用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|
+---+---+---+

希望这有帮助!

相关问题