如何将不同的聚合函数应用于同一列为什么要对 Spark 数据帧进行分组?

Rom*_*man 2 group-by apache-spark pyspark

要使用 pyspark 按 Spark 数据帧进行分组,我使用如下命令:

df2 = df.groupBy('_c1','_c3').agg({'_c4':'max', '_c2' : 'avg'})
Run Code Online (Sandbox Code Playgroud)

结果我得到这样的输出:

+-----------------+-------------+------------------+--------+                   
|              _c1|          _c3|          avg(_c2)|max(_c4)|
+-----------------+-------------+------------------+--------+
|        Local-gov|      HS-grad| 644952.5714285715|       9|
|        Local-gov|   Assoc-acdm|365081.64285714284|      12|
|     Never-worked| Some-college|          462294.0|      10|
|        Local-gov|    Bachelors|         398296.35|      13|
|      Federal-gov|      HS-grad|          493293.0|       9|
|          Private|         12th| 632520.5454545454|       8|
|        State-gov|    Assoc-voc|          412814.0|      11|
|                ?|      HS-grad| 545870.9230769231|       9|
|          Private|  Prof-school|340322.89130434784|      15|
+-----------------+-------------+------------------+--------+
Run Code Online (Sandbox Code Playgroud)

这很好,但有两件事我想念:

  1. 我想控制列的名称。例如,我想要命名一个新avg_c2avg(_c2)
  2. 我想以不同的方式聚合同一列。例如,我可能想知道 column 的最小值和最大值_c4。我尝试了以下方法,但它不起作用:

    df2 = df.groupBy('_c1','_c3').agg({'_c4':('min','max'), '_c2' : 'avg'})

有办法实现我所需要的吗?

Ram*_*jan 6

您必须使用withColumn api 并生成新列或替换旧列

或者您可以使用别名来获得所需的列名而不是默认值avg(_c2)

我还没有使用过 pyspark 但在 scala 中我做了类似的事情

import org.apache.spark.sql.functions._    
df2 = df.groupBy("_c1","_c3").agg(max(col("_c4")).alias("max_c4"), min(col("_c4")).alias("min_c4"), avg(col("_c2")).alias("avg_c2"))
Run Code Online (Sandbox Code Playgroud)