【问题标题】:pyspark How can i get only the max and min values for each parameter_code+county_namepyspark 如何仅获取每个参数_code+county_name 的最大值和最小值
【发布时间】:2022-01-15 09:33:36
【问题描述】:

我目前在 google colab notebook 中使用 pyspark,在进行了一些数据清理之后,我完成了一个数据框,该数据框具有: 参数代码;县名;每天的算术平均值

我需要一个表格,为每个参数提供具有最高值和最低值的县的名称

在完成这个 groupby 之后,我最终得到了我想要的(每个参数代码和县名都有最大值的值)但只有最大值,我还需要最小值

county_param_value_small_grouped_parameter_code = county_param_value_small.groupby('parameter_code','county_name').max('arithmetic_mean').orderBy("parameter_code","max(arithmetic_mean)",ascending=False).show(10)

我想最终得到一个表格,其中包含 2 个县名和每个参数代码的 2 个值,分别是最高值和最低值。 但是我在操作它时遇到了很多麻烦,因为它总是返回一个对象,我必须一次性完成所有条件并最终有一个 .show() 。

【问题讨论】:

  • 您是否只想将minarithmetic_mean 添加到您当前的结果中?您能否以纯文本形式提供一些示例数据和示例数据的预期结果?
  • 决赛桌应该是这样的 parameter_code |县名 |价值 88136 |马宏宁 | 0.909 88136 |东巴吞鲁日 | 0.0847 89463 |加尔维斯顿 | 0.893 89463 |道格拉斯 | 0.002 (...) (...) (...) 因为我想显示哪些县的空气质量最好/最差? (并考虑污染物的水平对县进行排名!)这就是为什么我需要为每个污染物水平设置两个行,我还试图获得一个具有最大值的表和一个具有最小值的表并以某种方式进行连接,但也很难弄清楚这一点出编辑:我认为当我换行时编辑器不接受它
  • 不要发布表格,代码,只需将其复制并粘贴为字符串。

标签: python apache-spark pyspark apache-spark-sql


【解决方案1】:

该问题的一个解决方案是使用窗口函数来为组中具有相同parameter_code 的每一行附加maxmin arithmetic_mean。最后过滤arithmetic_mean 等于组的minmax 值的行。

from pyspark.sql import functions as F
from pyspark.sql import Window as W

data = [("1", "IN", 10, ), ("1", "NL", 20, ), ("1", "DE", 15, ), ("2", "US", 100, ), ("2", "BE", 200, ), ("2", "FR", 150, )]

df = spark.createDataFrame(data, ("parameter_code", "county_name", "arithmetic_mean", ))

window_spec = W.partitionBy("parameter_code")

df.withColumn("max_arithmetic_mean", F.max("arithmetic_mean").over(window_spec))\
  .withColumn("min_arithmetic_mean", F.min("arithmetic_mean").over(window_spec))\
  .filter((F.col("arithmetic_mean") == F.col("max_arithmetic_mean")) | (F.col("arithmetic_mean") == F.col("min_arithmetic_mean")))\
  .select("parameter_code", "county_name", "arithmetic_mean").show()

输出

+--------------+-----------+---------------+
|parameter_code|county_name|arithmetic_mean|
+--------------+-----------+---------------+
|             1|         IN|             10|
|             1|         NL|             20|
|             2|         US|            100|
|             2|         BE|            200|
+--------------+-----------+---------------+

【讨论】:

  • 感谢您回答这个问题,看起来应该可以,但不幸的是,它给了我所有的参数代码,并给了我所有算术平均值的全零。
  • 您的数据集中的最小arithmetic_mean 可能是0。我建议过滤掉零,然后应用这个逻辑来验证这是否是原因。
  • 这是一个好点!谢谢。我要尝试一下,我会再次发表评论
  • 事实证明你一直都是对的,事实上,当我删除零行时,我得到了我正在寻找的决赛桌。谢谢你snithish
猜你喜欢
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2021-12-04
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多