基于其他列更新PySpark数据框中指定列的行数据
嗨,我来帮你搞定这个基于name列更新new_column的需求!PySpark里有几种高效的方式可以实现,我给你列两个最常用的方法:
方法1:使用
when + otherwise条件判断 这是最直观的方式,适合规则不多的场景,直接通过条件匹配来赋值:
首先导入需要的函数:
from pyspark.sql.functions import when, col
然后编写更新逻辑,比如我们想给不同的name设置不同的new_column值:
updated_df = new_df.withColumn( "new_column", when(col("name") == "sam", "User_A") .when(col("name") == "Tim", "User_B") .when(col("name") == "Jim", "User_C") .otherwise("Unknown") # 处理未匹配到的情况,避免null )
查看结果:
updated_df.show() +---+----+----------+ | id|name|new_column| +---+----+----------+ | 1| sam| User_A| | 2| Tim| User_B| | 3| Jim| User_C| | 4| sam| User_A| +---+----+----------+
方法2:使用
create_map处理多值映射 如果你的映射规则很多,用when串起来会很繁琐,这时候可以用create_map来构建一个映射字典,代码会更简洁:
先导入函数:
from pyspark.sql.functions import create_map, lit, col
定义映射关系,然后应用到列上:
# 定义name到new_column的映射字典 name_mapping = { "sam": "User_A", "Tim": "User_B", "Jim": "User_C" } # 把字典转成Spark的map结构 map_expr = create_map(*[lit(item) for pair in name_mapping.items() for item in pair]) # 更新new_column,未匹配的设为"Unknown" updated_df = new_df.withColumn( "new_column", map_expr.getItem(col("name")).otherwise("Unknown") )
运行后得到的结果和方法1完全一致,这种方式在映射规则多的时候维护起来更方便。
小提示
- 尽量使用PySpark的内置函数(比如
when、create_map),不要用自定义UDF,因为内置函数是经过优化的,性能比UDF好很多,尤其是处理大数据量的时候。 - 如果不需要默认值,可以去掉
.otherwise(),但未匹配的行new_column会保持null。
内容的提问来源于stack exchange,提问作者User12345
相关产品推荐
相关产品推荐

