in pyspark从包含字符串列表的列中获取最频繁的字符串

plupiseo  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(425)

使用包含列的Dataframe时,列中的值是列表,

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'
....
vsmadaxz

vsmadaxz1#

我看不出有什么理由 explode 以及 groupby 这里(计算密集型洗牌操作),如 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)

相关问题