首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从一个列中删除除少数列之外的所有子集?

如何从一个列中删除除少数列之外的所有子集?
EN

Stack Overflow用户
提问于 2021-11-09 05:50:40
回答 1查看 56关注 0票数 2

我有一列列表(a列)和另一列(b列),我想保留所有的超集、行和子集,它们在列b中比它们的超集更有价值。

例如,

输入数据框架:

代码语言:javascript
运行
复制
Column a = ([A,B,C],[A,C],[B,C],[J,S,K],[J,S],[J,K])
Column b = (10,15,7,8,9,8)

预期成果:

代码语言:javascript
运行
复制
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值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-09 15:22:19

您可以使用自left_anti连接来筛选满足该条件的行。

您的数据中需要有一个ID列,这里我使用monotonically_increasing_id函数为每一行生成一个ID

代码语言:javascript
运行
复制
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_intersectsize函数size(array_intersect(arr1, arr2)) = size(arr1)

代码语言:javascript
运行
复制
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|
#+---------+---+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69893383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档