+-------+--------------------+-------+
| 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_code
列electronics.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')
这样您将拥有所有列。之后,您可以只选择所需的列。