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

如何在PySpark中根据条件设置新标志位?附具体场景需求

PySpark实现匹配标记与缺失值填充

这需求很容易搞定,核心思路就是用左连接保住df1的所有记录,再针对匹配状态和缺失字段做简单处理就行,具体步骤和代码如下:

实现逻辑

  1. 左连接两张表:以df1作为主表,按照sid和cid两个字段与df做左连接。这样df1里的每一行都会被保留,能匹配到df的行会拿到对应的Cr值,匹配不上的Cr就会是null
  2. 生成匹配标记flag:根据左连接后Cr是否为null来判断是否匹配成功——如果Cr不为空,说明两边匹配上了,flag设为1;否则设为0
  3. 填充缺失的Cr值:用coalesce函数把Cr列的null值替换成0,满足需求里的缺失值填充要求

完整可运行代码

from pyspark.sql import functions as F

# 初始化你提供的原始数据
df = spark.createDataFrame(
    sc.parallelize([[1,1,2],[1,2,9], [2,1,2],[2,2,1], [4,1,5],[4,2,6], [5,1,3],[5,2,8]]), 
    ["sid","cid","Cr"]
)
df1 = spark.createDataFrame(
    sc.parallelize([[1,1],[1,2],[1,3], [2,1],[2,2],[2,3],[4,1],[4,2],[4,3],[5,1],[5,2],[5,3]]), 
    ["sid","cid"]
)

# 核心处理逻辑:左连接 → 生成flag → 填充Cr缺失值
result_df = df1.join(df, on=["sid", "cid"], how="left") \
    .withColumn("flag", F.when(F.col("Cr").isNotNull(), F.lit(1)).otherwise(F.lit(0))) \
    .withColumn("Cr", F.coalesce(F.col("Cr"), F.lit(0)))

# 查看最终结果
result_df.show()

运行结果

+---+---+---+----+
|sid|cid| Cr|flag|
+---+---+---+----+
|  1|  1|  2|   1|
|  1|  2|  9|   1|
|  1|  3|  0|   0|
|  2|  1|  2|   1|
|  2|  2|  1|   1|
|  2|  3|  0|   0|
|  4|  1|  5|   1|
|  4|  2|  6|   1|
|  4|  3|  0|   0|
|  5|  1|  3|   1|
|  5|  2|  8|   1|
|  5|  3|  0|   0|
+---+---+---+----+

这里要注意处理顺序:必须先判断原始的Cr是否为空来生成flag,再去填充Cr的缺失值。如果反过来先填充Cr,那所有Cr都不为空了,flag就会全是1,完全不符合需求哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:40:07