PySpark中如何正确拆分全名为名、中间名及姓氏?代码修正
修正PySpark姓名拆分逻辑实现预期结果
你的问题出在原代码用固定索引提取姓名各部分,没法适配两词、多词的全名格式。按照「首词为first_name,末词为last_name,中间所有词合并为middle_name(两词时中间名为空)」的规则,可通过以下代码实现:
import pyspark.sql.functions as F # 拆分全名为数组 df = df.withColumn("arr", F.split(F.col("Name"), " ")) # 提取各姓名部分 df = (df .withColumn("first_name", F.element_at(F.col("arr"), 1)) .withColumn("last_name", F.element_at(F.col("arr"), -1)) .withColumn("middle_name", F.when(F.size(F.col("arr")) <= 2, "") .otherwise(F.concat_ws(" ", F.slice(F.col("arr"), 2, F.size(F.col("arr")) - 2)))) .drop("arr")) # 可选:删除中间数组列
关键函数说明
F.element_at(arr, index): 支持正数/负数索引,负数索引直接取数组末尾元素,完美适配任意长度的全名。F.size(arr): 获取数组长度,用来判断是否需要提取中间名。F.slice(arr, start, length): 截取数组中从start索引开始、长度为length的子数组,这里从第2个元素开始,截取长度为「总长度-2」的部分(即去掉首尾元素后的所有内容)。F.concat_ws(" ", ...): 将截取到的中间名数组用空格拼接成字符串。
测试验证
用你提供的输入数据集运行上述代码后,输出将与预期一致:
| first_name | middle_name | last_name |
|---|---|---|
| Anubhav | Sharma | |
| Rakesh | Kumar | Sharma |
| Muthiah | Srinivas attapatu | Murlidharan |
内容的提问来源于stack exchange,提问作者Anubhav
相关产品推荐
相关产品推荐

