在Spark数据帧的n列中按行查找最频繁的值

时间:2018-10-14 18:37:22

标签: python apache-spark pyspark

如何在Spark DataFrame(pyspark 2.2.0)的4个两列中按行查找最频繁的值? df的示例:

col1 col2 col3 col4
13   15   14   14
Null 15   15   13
Null Null Null 13
Null Null Null Null
13   13   14   14

我的电话:

df = df.withColumn("frq", \
        most_frequent(col("col1"),col("col2"),col("col3"),col("col4")) \
        )

,结果df应该是

col1 col2 col3 col4  df
13   15   14   14    14
Null 15   15   13    15
Null Null Null 13    13
Null Null Null Null  Null
13   13   14   14    13

请注意,即使Null值是行中最频繁的值,也应从计算中省略Null值(不过,如果所有列均为Null,则应返回Null)。绑定值(df中的最后一行)可以返回任何关系。

1 个答案:

答案 0 :(得分:1)

使用collections.Counter编写udf:

from collections import Counter
from pyspark.sql.functions import udf

@udf
def mode(*v):
  counter = Counter(x for x in v if x is not None)
  if len(counter) > 0:
    return counter.most_common(1)[0][0]
  else:
    return None

df.withColumn('mode', mode('col1', 'col2', 'col3', 'col4')).show()
+----+----+----+----+----+
|col1|col2|col3|col4|mode|
+----+----+----+----+----+
|  13|  15|  14|  14|  14|
|null|  15|  15|  13|  15|
|null|null|null|  13|  13|
|null|null|null|null|null|
|  13|  13|  14|  14|  13|
+----+----+----+----+----+