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

Posted

技术标签:

【中文标题】在 Spark 数据框中的 n 列中按行查找最频繁的值【英文标题】:Finding the most frequent value by row among n columns in a Spark dataframe 【发布时间】:2018-10-14 18:37:21 【问题描述】:

我们如何在 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)。绑定值(df 中的最后一行)可以返回任何绑定值。

【问题讨论】:

【参考方案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|
+----+----+----+----+----+

【讨论】:

有帮助,但您不需要包含实际的 udf 运行。即 udf_mode = udf(mode)

以上是关于在 Spark 数据框中的 n 列中按行查找最频繁的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pandas 数据框中按行值对日期时间列进行排序?

如何根据Python中另一列中的日期查找最频繁的值

R 提取最常见的单词)/ n 克在列中按组

在 GROUP BY 中按行数获取前 N 行

如何使用 Spark 数据框中的 lit 在列中插入值?

在数据框中按组折叠文本[重复]