You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检查df1列值是否全存在于df2各日期names列并生成标记列

批量检查各日期下df1 names是否全包含于df2对应日期的实现方案

思路说明

核心逻辑是先提取df1的完整names集合,再按日期聚合df2的唯一names集合,最后通过集合差集判断每个日期是否完全包含df1的所有names。

具体代码实现(PySpark版本)

  1. 初始化数据与环境
from pyspark.sql import SparkSession
from pyspark.sql.functions import collect_set, size, array_except, when

spark = SparkSession.builder.appName("CheckNamesCoverage").getOrCreate()

# 构建示例df1:固定的names列表
df1_data = [("AB",), ("DC",), ("DE",), ("FG",), ("GG",), ("TR",)]
df1 = spark.createDataFrame(df1_data, ["names"])

# 构建示例df2:不同日期对应的names记录
df2_data = [
    ("2024-05-01", "AB"), ("2024-05-01", "DC"), ("2024-05-01", "DE"),
    ("2024-05-01", "FG"), ("2024-05-01", "GG"), ("2024-05-01", "TR"),
    ("2024-05-02", "AB"), ("2024-05-02", "DC"), ("2024-05-02", "DE"),
    ("2024-05-03", "AB"), ("2024-05-03", "DC"), ("2024-05-03", "DE"),
    ("2024-05-03", "FG"), ("2024-05-03", "GG"), ("2024-05-03", "TR"), ("2024-05-03", "XY")
]
df2 = spark.createDataFrame(df2_data, ["date", "names"])
  1. 提取df1的完整names集合
# 把df1的所有names转为数组常量
df1_full_names = df1.select(collect_set("names").alias("full_names")).first()["full_names"]
  1. 按日期聚合df2的names集合
# 分组后收集每个日期下的唯一names
df2_date_groups = df2.groupBy("date").agg(collect_set("names").alias("date_names"))
  1. 批量生成检查标记
# 通过集合差集判断:差集为空则说明df1的names全存在
result_df = df2_date_groups.withColumn(
    "all_names_present",
    when(size(array_except(df1_full_names, "date_names")) == 0, True).otherwise(False)
)

# 查看结果
result_df.show(truncate=False)

结果说明

运行后会输出每个日期的检查结果:

  • 2024-05-01:差集为空,标记为True
  • 2024-05-02:差集包含FG、GG、TR,标记为False
  • 2024-05-03:差集为空(即使多了XY也不影响,只要df1的names都存在),标记为True

内容的提问来源于stack exchange,提问作者Shruthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:20:54