如何在PySpark中根据条件设置新标志位?附具体场景需求
PySpark实现匹配标记与缺失值填充
这需求很容易搞定,核心思路就是用左连接保住df1的所有记录,再针对匹配状态和缺失字段做简单处理就行,具体步骤和代码如下:
实现逻辑
- 左连接两张表:以df1作为主表,按照
sid和cid两个字段与df做左连接。这样df1里的每一行都会被保留,能匹配到df的行会拿到对应的Cr值,匹配不上的Cr就会是null - 生成匹配标记flag:根据左连接后
Cr是否为null来判断是否匹配成功——如果Cr不为空,说明两边匹配上了,flag设为1;否则设为0 - 填充缺失的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
相关产品推荐
相关产品推荐

