为啥 PySpark 中的 agg() 一次只能汇总一列? [复制]

Posted

技术标签:

【中文标题】为啥 PySpark 中的 agg() 一次只能汇总一列? [复制]【英文标题】:Why agg() in PySpark is only able to summarize one column at a time? [duplicate]为什么 PySpark 中的 agg() 一次只能汇总一列? [复制] 【发布时间】:2017-06-06 07:41:59 【问题描述】:

对于下面的数据框

df=spark.createDataFrame(data=[('Alice',4.300),('Bob',7.677)],schema=['name','High'])

当我试图找到最小值和最大值时,我只会在输出中得到最小值。

df.agg('High':'max','High':'min').show()
+-----------+
|min(High)  |
+-----------+
|    2094900|
+-----------+

为什么 agg() 不能像 Pandas 中那样同时给出最大值和最小值?

【问题讨论】:

如果有人还在想为什么 agg() 不能像 Pandas 中那样同时给出 max 和 min? 它也不适用于 pandas 因为 pandas 和 pyspark 中的 agg() 都接受字典,并且我们知道字典不能有多个同名键,因此 df.agg('High':'max','High':'min').show() 实际上是 df.agg('High':'min').show() 因为 'High':'max' 被重写为 'High':'min' CONTD:pandas 中的语法将是 df.agg('High': 'min(High)': np.min, 'max(High)': np.max) 【参考方案1】:

如你所见here:

agg(*exprs)

Compute 聚合并将结果作为 DataFrame 返回。

可用的聚合函数有 avg、max、min、sum、count。

如果 exprs 是从字符串到字符串的单个 dict 映射,则键是要对其执行聚合的列,值是聚合函数。

另外,exprs 也可以是聚合 Column 表达式的列表。

参数:exprs – 一个从列名(字符串)到聚合函数(字符串)的字典映射,或者一个列列表。

您可以使用列列表并在每一列上应用您需要的功能,如下所示:

>>> from pyspark.sql import functions as F

>>> df.agg(F.min(df.High),F.max(df.High),F.avg(df.High),F.sum(df.High)).show()
+---------+---------+---------+---------+
|min(High)|max(High)|avg(High)|sum(High)|
+---------+---------+---------+---------+
|      4.3|    7.677|   5.9885|   11.977|
+---------+---------+---------+---------+

【讨论】:

这对我在使用 Spark 2.4 和 Python 3.2 的 Databricks 中不起作用。

以上是关于为啥 PySpark 中的 agg() 一次只能汇总一列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark agg 函数将行“分解”成列

PySpark 一次性对分区执行第一个和最后一个函数

计算两列之间的不同集,同时使用 agg 函数 Pyspark Spark Session

将值插入行类型的 Pyspark 中的 Hive 表

PySpark:读取 pyspark 框架中的 csv 数据。为啥它在框架中显示特殊字符?除了使用熊猫之外,以表格形式显示的任何方式[重复]

pyspark 查询的 SQL 等价物