为啥 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() 一次只能汇总一列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
计算两列之间的不同集,同时使用 agg 函数 Pyspark Spark Session
PySpark:读取 pyspark 框架中的 csv 数据。为啥它在框架中显示特殊字符?除了使用熊猫之外,以表格形式显示的任何方式[重复]