如何聚合 pyspark 数据框并在列中显示列表的交集?

How to agg a pyspark dataframe and show the intersection of the lists in a column?

我有这样一个数据框:

+-------+-----------+
| grupos|    valores|
+-------+-----------+
|grupo_1|  [1, 2, 3]|
|grupo_1|  [1, 2, 5]|
|grupo_1|  [1, 2, 6]|
|grupo_2|  [1, 2, 7]|
|grupo_2| [12, 2, 7]|
|grupo_2| [32, 2, 7]|
+-------+-----------+

我需要一些东西来分组并只显示列表的交集,比如:

+-------+-----------+
| grupos|    valores|
+-------+-----------+
|grupo_1|     [1, 2]|
|grupo_2|     [2, 7]|
+-------+-----------+

谁能帮帮我?

grupos 列分组并收集 valores 的列表。然后使用 aggregatearray_intersect 函数,你找到所有子数组的交集:

from pyspark.sql import functions as F

df = spark.createDataFrame([
    ("grupo_1", [1, 2, 3]), ("grupo_1", [1, 2, 5]),
    ("grupo_1", [1, 2, 6]), ("grupo_2", [1, 2, 7]),
    ("grupo_2", [12, 2, 7]), ("grupo_2", [32, 2, 7])
], ["grupos", "valores"])

df1 = df.groupBy("grupos").agg(
    F.collect_set("valores").alias("valores")
).withColumn(
    "valores",
    F.expr("aggregate(valores, valores[0], (acc, x) -> array_intersect(acc, x))")
)

df1.show()
#+-------+-------+
#|grupos |valores|
#+-------+-------+
#|grupo_1|[1, 2] |
#|grupo_2|[2, 7] |
#+-------+-------+