如何聚合 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
的列表。然后使用 aggregate
和 array_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] |
#+-------+-------+
我有这样一个数据框:
+-------+-----------+
| 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
的列表。然后使用 aggregate
和 array_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] |
#+-------+-------+