查找前一行和计算时生成Pyspark列

时间:2017-09-19 18:41:53

标签: python hadoop apache-spark pyspark

需要动态生成列,并查看以前的行值。

请帮助我渡过这个障碍。到目前为止,尝试使用下面分享的代码

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

1 个答案:

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