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)
这很好,但有两件事我想念:
avg_c2列avg(_c2)。我想以不同的方式聚合同一列。例如,我可能想知道 column 的最小值和最大值_c4。我尝试了以下方法,但它不起作用:
df2 = df.groupBy('_c1','_c3').agg({'_c4':('min','max'), '_c2' : 'avg'})
有办法实现我所需要的吗?
您必须使用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)
| 归档时间: |
|
| 查看次数: |
3459 次 |
| 最近记录: |