在 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 列中按行查找最频繁的值的主要内容,如果未能解决你的问题,请参考以下文章