在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 数据框的模式属性(来自镶木地板文件)中获取特定字段名称的数据类型?

使用 pyspark 在 groupBy 之后保存数据框视图

如何访问数据框的(多)索引?

如何在 Pyspark 中使用 groupby 和数组元素?

如何在数据框的开头移动 pyspark 数据框的特定列