pyspark - PYSPARK:查找不包括前 1 个百分位数据的变量的平均值
问题描述
我有一个数据集,该数据集由多个变量分组,我们在其中找到诸如 mean 、 std dev 等聚合。现在我想找到不包括前 1 个百分位数数据的变量的均值
我正在尝试类似的东西
df_final=df.groupby(groupbyElement).agg(mean('value').alias('Mean'),stddev('value').alias('Stddev'),expr('percentile(value, array(0.99))')[0].alias('99_percentile'),mean(when(col('value')<=col('99_percentile'),col('value')))
但似乎 spark 不能使用在同一组语句中定义的 agg 名称。
我什至试过这个,
~df_final=df.groupby(groupbyElement).agg(mean('value').alias('Mean'),stddev('value').alias('Stddev'),mean(when(col('value') <=expr('percentile(value, array(0.99))')[0],col('value')))~
但它会引发以下错误:pyspark.sql.utils.AnalysisException:'不允许在另一个聚合函数的参数中使用聚合函数。请在子查询中使用内部聚合函数。
我希望有人能够回答这个问题
更新:我尝试做其他方式
解决方案
这是对您的代码的直接修改。它将聚合 df 两次。据我所知,这是必需的。
df_final=(
df.join(df
.groupby(groupbyElement)
.agg(expr('percentile(value, array(0.99))')[0].alias('99_percentile'),
on=["groupbyElement"], how="left"
)
.groupby(groupbyElement)
.agg(mean('value').alias('Mean'),
stddev('value').alias('Stddev'),
mean(when(col('value')<=col('99_percentile'), col('value')))
)
推荐阅读
- bash - Ansible:与 docker 相关的命令在 playbook 中不起作用,但一旦直接运行就起作用
- amazon-web-services - 无法连接到 XX.XX.XXX.XX 端口 9200:EC2 上的连接被拒绝
- google-bigquery - BigQuery 无法解析 avro shcema 文件
- google-apps-script - 如何在 Google Apps 脚本中多次加快复制/创建文件的速度?
- javascript - 通过公共键和值组合数组中的对象
- flask - 如何修复用户'对象没有属性'is_active'?
- python - 如何判断一个字符串是否有重复字符?
- entity-framework - EF Core 内存中数组映射
- android - 尽管类存在,Android Studio 无法找到显式的活动类
- android-layout - 如何构建 Lite 应用程序,例如 Twitter Lite 或 Facebook Lite