我有一列列表(a
列)和另一列(b
列),我想保留所有的超集、行和子集,它们在列b中比它们的超集更有价值。
例如,
输入数据框架:
Column a = ([A,B,C],[A,C],[B,C],[J,S,K],[J,S],[J,K])
Column b = (10,15,7,8,9,8)
预期成果:
Column a = ([A,B,C],[A,C],[J,S,K],[J,S])
Column b = (10,15,8,9)
在这里,[B,C]
和[A,C]
是[A,B,C]
的子集,但是我们只保留[A,C]
,因为这个子集在列b
中有15
,这比b
列中的超集([A,B,C]
)值要大。类似地,超集[J,S,K]
与其子集[J,S]
一起保留,因为它在列b
中的值大于超集列b
值。
发布于 2021-11-09 15:22:19
您可以使用自left_anti
连接来筛选满足该条件的行。
您的数据中需要有一个ID
列,这里我使用monotonically_increasing_id
函数为每一行生成一个ID
:
import pyspark.sql.functions as F
df = df.withColumn("ID", F.monotonically_increasing_id())
df.show()
#+---------+---+-----------+
#| a| b| ID|
#+---------+---+-----------+
#|[A, B, C]| 10| 8589934592|
#| [A, C]| 15|17179869184|
#| [B, C]| 7|25769803776|
#|[J, S, K]| 8|42949672960|
#| [J, S]| 9|51539607552|
#| [J, K]| 8|60129542144|
#+---------+---+-----------+
现在,要验证数组arr1
是另一个数组arr2
的子集,可以使用array_intersect
和size
函数size(array_intersect(arr1, arr2)) = size(arr1)
。
df_result = df.alias("df1").join(
df.alias("df2"),
(
(F.size(F.array_intersect("df1.a", "df2.a")) == F.size("df1.a"))
& (F.col("df1.b") <= F.col("df2.b"))
& (F.col("df1.ID") != F.col("df2.ID")) # not the same row
),
"left_anti"
).drop("ID")
df_result.show()
#+---------+---+
#| a| b|
#+---------+---+
#|[A, B, C]| 10|
#| [A, C]| 15|
#|[J, S, K]| 8|
#| [J, S]| 9|
#+---------+---+
https://stackoverflow.com/questions/69893383
复制相似问题