我想在这个数据框中找到任务列的模式:
+-----+-----------------------------------------+
| id | task |
+-----+-----------------------------------------+
| 101 | [person1, person1, person3] |
| 102 | [person1, person2, person3] |
| 103 | null |
| 104 | [person1, person2] |
| 105 | [person1, person1, person2, person2] |
| 106 | null |
+-----+-----------------------------------------+
如果有多种模式,我想显示所有模式。有人可以帮我得到这个输出:
+-----+-----------------------------------------+---------------------------+
| id | task | mode |
+-----+-----------------------------------------+---------------------------+
| 101 | [person1, person1, person3] |[person1] |
| 102 | [person1, person2, person3] |[person1, person2, person3]|
| 103 | null |[] |
| 104 | [person1, person2] |[person1, person2] |
| 105 | [person1, person1, person2, person2] |[person1, person2] |
| 106 | null |[] |
+-----+-----------------------------------------+---------------------------+
这是我在这里的第一个问题。非常感谢任何帮助或提示。谢谢你。
最佳答案
我看不出有理由使用 UDF
对于这种情况 spark2.4+
因为我们可以使用 higher order functions
以获得所需的输出。与高阶函数相比,使用计数器的 UDF 对于大数据来说会非常慢:
from pyspark.sql import functions as F
df\
.withColumn("most_common", F.expr("""transform(array_distinct(values),\
x-> array(aggregate(values, 0,(acc,t)->acc+IF(t=x,1,0)),x))"""))\
.withColumn("most_common", F.expr("""transform(filter(most_common, x-> x[0]==array_max(most_common)[0]),y-> y[1])"""))\
.show(truncate=False)
#+---+----------------------------------------+---------------------------+
#|id |values |most_common |
#+---+----------------------------------------+---------------------------+
#|1 |[good, good, good, bad, bad, good, good]|[good] |
#|2 |[bad, badd, good, bad,, good, bad, good]|[bad, good] |
#|2 |[person1, person2, person3] |[person1, person2, person3]|
#|2 |null |null |
#+---+----------------------------------------+---------------------------+
关于python - 如何在 Pyspark 中找到数组列的多模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63930235/