在pyspark数据框的groupby中获取最少的行集[重复]
Posted
技术标签:
【中文标题】在pyspark数据框的groupby中获取最少的行集[重复]【英文标题】:Getting the least set of rows in a groupby of a pyspark dataframe [duplicate] 【发布时间】:2018-09-19 12:05:17 【问题描述】:我有一个带有值的数据框
#+-------+---------+-----+
#|name1 |name 2 |score|
#+-------+---------+-----+
#| abcdef| abcghi | 3|
#| abcdef| abcjkl | 3|
#| abcdef| abcyui | 3|
#| abcdef| abrtyu | 4|
#| pqrstu| pqrswe | 2|
#| pqrstu| pqrsqw | 2|
#| pqrstu| pqrzxc | 3|
#+-------+---------+-----+
我需要按 name1 分组并选择得分最低的行。
我知道我可以在 name1 上的 groupby 之后选择第一行,然后按升序对分数进行排序,然后选择第一行。我这样做是通过
joined_windows = Window().partitionBy("name1").orderBy(col("score").asc())
result = joined_df.withColumn("rn", row_number().over(joined_windows)).where(col("rn") == 1).drop("rn")
但我希望数据框保存以下值(即,每组中得分最低的行集。
#+-------+---------+-----+
#|name1 |name 2 |score|
#+-------+---------+-----+
#| abcdef| abcghi | 3|
#| abcdef| abcjkl | 3|
#| abcdef| abcyui | 3|
#| pqrstu| pqrswe | 2|
#| pqrstu| pqrsqw | 2|
#+-------+---------+-----+
【问题讨论】:
【参考方案1】:为了保持多个值,可以使用这样的代码:
val joined_windows = Window.partitionBy("name1")
val result = df.withColumn("rn", min($"score").over(joined_windows))
result.where($"rn"===$"score").drop("rn").show(false)
输出:
+------+------+-----+
|name1 |name 2|score|
+------+------+-----+
|abcdef|abcghi|3 |
|abcdef|abcjkl|3 |
|abcdef|abcyui|3 |
|pqrstu|pqrswe|2 |
|pqrstu|pqrsqw|2 |
+------+------+-----+
【讨论】:
表示列 Score 不可迭代。在代码的第二行 Scala 代码提供,$"score" 与 col("score") 含义相同 对不起帕夏。你是绝对正确的。原因是我使用了被 python 覆盖的 min 函数。可以通过from pyspark.sql.functions import min as sparkMin
修复该错误并使用 sparkMin 而不是 min【参考方案2】:
您可以按两列分组:
df \
.groupBy('name1', 'name2') \
.agg(F.min('score'))
【讨论】:
以上是关于在pyspark数据框的groupby中获取最少的行集[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何从 pyspark 数据框的模式属性(来自镶木地板文件)中获取特定字段名称的数据类型?
使用 pyspark 在 groupBy 之后保存数据框视图