Apache spark 在pyspark中减去两行,并将ans追加为新行

Apache spark 在pyspark中减去两行,并将ans追加为新行,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有下面的pyspark数据帧 stat col_A col_B col_C col_D count 14 14 14 14 14 75% 4 4001 160987 49 50% 3 3657 131225 38 我想从75%行中减去50%行,然后在同一数据帧中添加新行结果,如下所示:

我有下面的pyspark数据帧

     stat   col_A    col_B       col_C     col_D   
    count   14       14          14 14      14
     75%    4        4001       160987      49  
     50%    3        3657       131225      38  
我想从75%行中减去50%行,然后在同一数据帧中添加新行结果,如下所示:

     stat   col_A    col_B       col_C     col_D   
    count   14       14          14 14      14
     75%    4        4001       160987      49  
     50%    3        3657       131225      38  
   result   1        344        26762       11

因为需要对行而不是列进行操作,所以不像人们想象的那么容易。请尝试下面的代码,使用
union
再添加一行:

import pyspark.sql.functions as F

result = df.union(
    df.agg(
        F.lit('result').alias('stat'), 
        *[
            (
                F.max(F.when(F.col('stat') == '75%', F.col(c))) - 
                F.max(F.when(F.col('stat') == '50%', F.col(c)))
            ).alias(c) 
            for c in df.columns[1:]
        ]
    )
)

result.show()
+------+-----+-----+------+-----+
|  stat|col_A|col_B| col_C|col_D|
+------+-----+-----+------+-----+
| count|   14|   14|  1414|   14|
|   75%|    4| 4001|160987|   49|
|   50%|    3| 3657|131225|   38|
|result|    1|  344| 29762|   11|
+------+-----+-----+------+-----+

因为需要对行而不是列进行操作,所以不像人们想象的那么容易。请尝试下面的代码,使用
union
再添加一行:

import pyspark.sql.functions as F

result = df.union(
    df.agg(
        F.lit('result').alias('stat'), 
        *[
            (
                F.max(F.when(F.col('stat') == '75%', F.col(c))) - 
                F.max(F.when(F.col('stat') == '50%', F.col(c)))
            ).alias(c) 
            for c in df.columns[1:]
        ]
    )
)

result.show()
+------+-----+-----+------+-----+
|  stat|col_A|col_B| col_C|col_D|
+------+-----+-----+------+-----+
| count|   14|   14|  1414|   14|
|   75%|    4| 4001|160987|   49|
|   50%|    3| 3657|131225|   38|
|result|    1|  344| 29762|   11|
+------+-----+-----+------+-----+

谢谢你的回答,这对我很有用。你能解释一下它是如何工作的吗?它通过对所有行进行聚合并只过滤stat为75%或50%的行来获得对应于75%和50%的行。谢谢你的回答,它对我有用。您能解释一下它是如何工作的吗?它通过对所有行进行聚合,只过滤stat为75%或50%的行,从而获得对应于75%和50%的行。