【问题标题】:In Pyspark get most frequent string from a column with list of strings在 Pyspark 中,从包含字符串列表的列中获取最频繁的字符串
【发布时间】:2020-09-17 03:07:55
【问题描述】:

使用包含列的数据框,列中的值是列表,

id    |   values
1     |   ['good','good','good','bad','bad','good','good']
2     |   ['bad','badd','good','bad',Null,'good','bad']
....

如何获得列表中显示频率最高的字符串? 预期输出:

id   | most_frequent
1    | 'good'
2    | 'bad'
....

【问题讨论】:

  • 你试过this 吗?
  • 这是针对整个列的,我需要为值列中的每个列表找到最大值。
  • 是的,同样的 udf 也可以用于单列数组。但是,对于 spark 2.4+ ,接受的答案更好。

标签: apache-spark pyspark


【解决方案1】:

我没有看到 explodegroupby 的理由(计算密集型随机操作),就像 Spark2.4+ ,我们可以使用 higher order functions 来获得您想要的输出:

from pyspark.sql import functions as F

df\
  .withColumn("most_common", F.expr("""sort_array(transform(array_distinct(values),\
                                      x-> array(aggregate(values, 0,(acc,t)->acc+IF(t=x,1,0)),x)),False)[0][1]"""))\
  .show(truncate=False)

#+---+----------------------------------------+-----------+
#|id |values                                  |most_common|
#+---+----------------------------------------+-----------+
#|1  |[good, good, good, bad, bad, good, good]|good       |
#|2  |[bad, badd, good, bad,, good, bad]      |bad        |
#+---+----------------------------------------+-----------+

我们也可以使用 array_max 代替 sort_array

from pyspark.sql import functions as F

df\
  .withColumn("most_common", F.expr("""array_max(transform(array_distinct(values),\
                                      x-> array(aggregate(values, 0,(acc,t)->acc+IF(t=x,1,0)),x)))[1]"""))\
  .show(truncate=False)

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 2015-09-30
    • 2018-08-18
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多