如何在pyspark中将全名拆分为不同的列。
输入CSV:
Name,Marks
Sam Kumar Timberlake,83
Theo Kumar Biber,82
Tom Kumar Perry,86
Xavier Kumar Cruse,87
输出Csv应该是:
FirstName,MiddleName,LastName,Marks
Sam,Kumar,Timberlake,83
Theo,Kumar,Biber,82
Tom,Kumar,Perry,86
Xavier,Kumar,Cruse,87
答案 0 :(得分:0)
我确信有更好的方法,但是更长的方法是恢复原状。意思是,做好工作。我创建了两个名字,然后手动将数据清除为名字中间名和姓氏。我认为没有任何机器语言可以告诉您该人有两个名字和一个中间名,除非该人使用破折号表示两个名字和两个姓氏(出生并结婚成姓氏)并使用常识姓氏,并为错误做好准备。除非需要再次手动,否则必须手动执行。您确定是因为您打电话给他们并且确定知道。
数学方法是将姓氏与其余部分分开。这就像用中间名加里(Gary)叫别人的名字叫约翰一样。只要您所指出的人理解为合法,错误是不可避免的。不知道这是否有意义。
答案 1 :(得分:0)
这应在您的特定情况下起作用:
import pyspark.sql.functions as F
df = df.withColumn(
"arr", F.split(F.col("Name"), " ")
)
df = (
df
.withColumn('FirstName', F.arr.getItem(0))
.withColumn('MiddleName', F.arr.getItem(1))
.withColumn('LastName', F.arr.getItem(2))
)
如果您要包括某人具有多个中间名的情况,则:
df = (
df
.withColumn('FirstName', df.arr.getItem(0))
.withColumn('LastName', df.arr[F.size(df.arr)-1])
)
df = df.withColumn(
'MiddleName',
F.trim(F.expr("substring(Name, length(FirstName)+1, length(Name)-length(LastName)-length(FirstName))"))
)