new*_*eaf 6 apache-spark pyspark
使用包含列的数据框,列中的值是列表,
id | values
1 | ['good','good','good','bad','bad','good','good']
2 | ['bad','badd','good','bad',Null,'good','bad']
....
Run Code Online (Sandbox Code Playgroud)
如何获得列表中最常显示的字符串?预期输出:
id | most_frequent
1 | 'good'
2 | 'bad'
....
Run Code Online (Sandbox Code Playgroud)
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 |
#+---+----------------------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)
我们也可以用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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
935 次 |
最近记录: |