在groupBy后按最大值查询一列的另一列


+-------+--------------------+-------+
|  brand|       category_code|  count|
+-------+--------------------+-------+
|samsung|electronics.smart...|1782386|
|  apple|electronics.smart...|1649525|
| xiaomi|electronics.smart...| 924383|
| huawei|electronics.smart...| 477946|
|   oppo|electronics.smart...| 242022|
|samsung|electronics.video.tv| 183988|
|  apple|electronics.audio...| 165277|
|   acer|  computers.notebook| 154599|
|  casio|  electronics.clocks| 141403|

我想在category_code列上执行groupBy后,从brand列中选择一个与count列最大值对应的值。因此,在category_codeelectronics.smartphone组的第一行中,我想要brand列中的字符串samsung,因为它在计数列中具有最大值…

第一个groupBy用于识别每个category_code中具有最大计数的行,然后与原始数据框连接以检索与最大计数对应的品牌值:

df1 =  df.groupBy("category_code").agg(F.max("count").alias("count"))

df2 = df.join(df1, ["count", "category_code"]).drop("count")

这将产生df2,如下所示

category_code          brand
---------------------------
electronics.smart...   samsung
electronics.video.tv   samsung
electronics.audio      apple
computers.notebook     acer
electronics.clocks     casio

您可以使用像

这样的窗口函数
from pyspark.sql.functions import col, row_number
from pyspark.sql.window import Window
window=Window.partitionBy('category_code').orderBy(col('count').desc())
df = df.withColumn('row_number', row_number().over(window))
.filter(col('row_number')==1).drop('row_number')

这样您将拥有所有列。之后,您可以只选择所需的列。

相关内容

  • 没有找到相关文章