PySpark中使用UDF拆分单元格返回首尾元素,处理Null值问题
PySpark处理含Null的姓名拆分问题
原代码问题
你的代码报错是因为当FullName为Null时,函数里直接执行for i in full_name——None是不可迭代对象,这会直接触发NoneType相关错误。而且你没必要遍历输入值,直接判断是否为Null即可。
修正后的自定义UDF
先判断输入是否为Null,同时处理拆分后只有单个名字的场景(避免索引越界):
from pyspark.sql.functions import udf, col from pyspark.sql.types import StringType def get_name(full_name): if full_name is None: return None name_list = full_name.split(' ') # 只有单个名字时直接返回该名字 if len(name_list) == 1: return name_list[0] return f"{name_list[0]} {name_list[-1]}" udf_get_name = udf(get_name, StringType()) df_parquet = df_parquet.withColumn("NameReduz", udf_get_name(col("FullName")))
更高效的内置函数方案(推荐)
Spark内置函数无需自定义UDF,性能更优(避免Python与JVM之间的序列化开销),且自动处理Null值:
from pyspark.sql.functions import col, split, element_at, concat_ws df_parquet = df_parquet.withColumn( "NameReduz", concat_ws( " ", element_at(split(col("FullName"), " "), 1), element_at(split(col("FullName"), " "), -1) ) )
split:把姓名按空格拆分成数组element_at:取数组的第一个(索引1)和最后一个(索引-1)元素concat_ws:用空格拼接两个元素,当原字段为Null时,结果自动为Null,完全符合你的预期输出
内容的提问来源于stack exchange,提问作者dcrosseto
相关产品推荐
相关产品推荐

