python - 如何在 Pyspark 中找到数组列的多模式

标签 python apache-spark pyspark apache-spark-sql

我想在这个数据框中找到任务列的模式:

+-----+-----------------------------------------+
|  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/

相关文章:

java - Spark java : java. lang.IllegalArgumentException:对象不是声明类的实例

apache-spark - kubernetes的Spark集群中的CrashLoopBackOff:nohup:无法执行 '--':没有这样的文件或目录

scala - Spark 1.6 将函数应用于名称中带有点的列/如何正确转义 colName

apache-spark - Apache Spark独立调度程序-为什么驱动程序需要在 'cluster'模式下使用整个内核?

python - 我如何判断哪个小部件触发了 Tkinter 中的事件?

python - 在 python 中使用 Clipper 库生成多边形偏移

python - 从列表 PySpark 的列表创建单行数据框

Pyspark:错误——Java 网关进程在向驱动程序发送其端口号之前退出

python - 在 Python 3.8 上安装 XGBoost 的问题

python - 如何退出帮助菜单?