【问题标题】:Find id of maximum value and average pyspark dataframe查找最大值和平均 pyspark 数据帧的 id
【发布时间】:2021-11-10 09:43:01
【问题描述】:

如何使用 pyspark 数据框找到另一列的最大值和平均值的 id?

df:

+-------------+-------+----------+---------+----------+--------+------+------------------+
|ChargingEvent|   CPID| StartDate|StartTime|   EndDate| EndTime|Energy|    PluginDuration|
+-------------+-------+----------+---------+----------+--------+------+------------------+
|     16673806|AN11719|2017-12-31| 14:46:00|2017-12-31|18:00:00|   2.4|3.2333333333333334|
|     16670986|AN01706|2017-12-31| 11:25:00|2017-12-31|13:14:00|   6.1|1.8166666666666667|
|      3174961|AN18584|2017-12-31| 11:26:11|2018-01-01|12:54:11|    24|25.466666666666665|

当前代码:

df.agg({'PluginDuration': 'max'}).show()
df.agg({'PluginDuration': 'avg'}).show()

然后将所有列重命名为如下预期的结果:

+-------------------+-------------------+------------------+
|id                 |max_value          |avg_value
+-------------------+-------------------+-------------------+
| QWER              |96.26              |12.35              |

idCPID 重命名。并且max_valueavg_value 需要四舍五入到小数点后两位。

【问题讨论】:

  • 您需要使用数据框方法还是 SQL 方法可以?
  • Dataframe 方法,最好。但是我打开了@StuartMills

标签: python pyspark


【解决方案1】:

我基本上采用了一种 SQL 方法来适应数据框方法,该方法有效并回答了问题。

from pyspark.sql import functions as F

# get the max and average values from the column
mx = df.agg({'PluginDuration':'max'}).collect()[0][0]
av = df.agg({'PluginDuration':'avg'}).collect()[0][0]

# add max and avg olumns, then select cols with rename
# and then sort by value and limit to top
df\
  .withColumn('max_value', F.lit(round(mx,2)))\
  .withColumn('avg_value', F.lit(round(av,2)))\
  .sort('PluginDuration', ascending = False)\
  .selectExpr('CPID as id', 'max_value', 'avg_value')\
  .limit(1)\
  .show()

【讨论】:

  • F.lit 是干什么用的?
  • .withColumn 中的第二个参数需要是一列,但最大值是单个值,lit 只是将一个值转换为一列,以便数据框获得一整列。 litwithColumn
猜你喜欢
  • 2020-07-04
  • 2017-07-24
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2015-01-16
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多