需要动态生成列,并查看以前的行值。
请帮助我渡过这个障碍。到目前为止,尝试使用下面分享的代码
Spark Dataframe低于
cat a b c
1 null 0 0
1 0 9 0
2 0 126 0
2 7 0 0
2 36 0 0
3 35 0 0
输出应如下
cat a b c d
1 null 0 0 null
1 0 9 0 0
2 0 126 0 9
2 7 0 0 119
2 36 0 0 83
2 35 0 0 48
以下是d
列动态生成的代码是使用的代码,请不要使用请帮助
w=Window().partitionBy().orderBy('cat')
df=df.withColumn('d',lag("b").over(w)-df.a+df.c)
df.show()
问题是公式没有得到重复的公式是prev(b)-a + c
答案 0 :(得分:2)
希望这有帮助!
import pyspark.sql.functions as f
from pyspark.sql.window import Window
df = sc.parallelize([
[1,None, 0, 0],
[1,0,9,0],
[2,0,126,0],
[2,7,0,0],
[2,36,0,0],
[2,35,0,0]
]).toDF(('cat','a', 'b', 'c'))
df1 = df.withColumn("row_id", f.monotonically_increasing_id())
w = Window.partitionBy().orderBy(f.col("row_id"))
df1 = df1.withColumn("d", f.lag("b").over(w)- f.col("a") + f.col("c")).drop("row_id")
df1.show()
输出是:
+---+----+---+---+----+
|cat| a| b| c| d|
+---+----+---+---+----+
| 1|null| 0| 0|null|
| 1| 0| 9| 0| 0|
| 2| 0|126| 0| 9|
| 2| 7| 0| 0| 119|
| 2| 36| 0| 0| -36|
| 2| 35| 0| 0| -35|
+---+----+---+---+----+