如何在PySpark中获取数据帧的最常见值

Pyt*_*ark 2 python mode apache-spark pyspark

我熟悉Pandas数据框,我使用函数"mode"和"groupby"来获取最常见的值,如下所示

df3=df5.groupby(['band']).apply(lambda x: x.mode())
Run Code Online (Sandbox Code Playgroud)

但是我在PySpark中遇到了一些困难.

我有一个火花数据框如下:

band      A3    A5  status
4G_band1800 12  18  TRUE
4G_band1800 12  18  FALSE
4G_band1800 10  18  TRUE
4G_band1800 12  12  TRUE
4g_band2300 6   24  FALSE
4g_band2300 6   22  FALSE
4g_band2300 6   24  FALSE
4g_band2300 3   24  TRUE
Run Code Online (Sandbox Code Playgroud)

上面的截图

我想要的是如下:

band      A3    A5  status
4G_band1800 12  18  TRUE
4g_band2300 6   24  FALSE
Run Code Online (Sandbox Code Playgroud)

上面的截图

我尝试了所有可能的组合,但没有任何合理的输出.请建议一个方法.

Psi*_*dom 7

在不定义自己的情况下UDAF,您可以定义模式函数(udf)并使用它,collect_list如下所示:

import pyspark.sql.functions as F
@F.udf
def mode(x):
    from collections import Counter
    return Counter(x).most_common(1)[0][0]

cols = ['A3', 'A5', 'status']
agg_expr = [mode(F.collect_list(col)).alias(col) for col in cols]
df.groupBy('band').agg(*agg_expr).show()

+-----------+---+---+------+
|       band| A3| A5|status|
+-----------+---+---+------+
|4G_band1800| 12| 18|  true|
|4g_band2300|  6| 24| false|
+-----------+---+---+------+
Run Code Online (Sandbox Code Playgroud)