将Spark Dataframe name列拆分为三列

将Spark Dataframe name列拆分为三列,dataframe,pyspark,split,Dataframe,Pyspark,Split,我在Spark中有一个数据框,列是name,它是一个由空格分隔的字符串,棘手的是一些名称有中间名,而其他名称没有。如何将列拆分为firstname、middlename和lastname?我使用F.split,不知道如何区分中间名和姓氏。我明白我不能在Spark中使用负索引。看看我的样品 from pyspark.sql import functions as F cols = ['id', 'name'] vals = [('l03', 'Bob K Barry'), ('S20', 'Cin

我在Spark中有一个数据框,列是name,它是一个由空格分隔的字符串,棘手的是一些名称有中间名,而其他名称没有。如何将列拆分为firstname、middlename和lastname?我使用F.split,不知道如何区分中间名和姓氏。我明白我不能在Spark中使用负索引。看看我的样品

from pyspark.sql import functions as F
cols = ['id', 'name']
vals = [('l03', 'Bob K Barry'), ('S20', 'Cindy Winston'), ('l10', 'Jerry Kyle Moore'), ('j31', 'Dora Larson')]
df = spark.createDataFrame(vals, cols)
df.show()
+---+----------------+                                                          
| id|            name|
+---+----------------+
|l03|     Bob K Barry|
|S20|   Cindy Winston|
|l10|Jerry Kyle Moore|
|j31|     Dora Larson|
+---+----------------+


split_col = F.split(df['name'], ' ')
df = df.withColumn('firstname', split_col.getItem(0))
df.show()
+---+----------------+---------+                                                
| id|            name|firstname|
+---+----------------+---------+
|l03|     Bob K Barry|      Bob|
|S20|   Cindy Winston|    Cindy|
|l10|Jerry Kyle Moore|    Jerry|
|j31|     Dora Larson|     Dora|
+---+----------------+---------+

如何继续拆分?非常感谢。

让数组中的第一个元素始终为
名字
,最后一个元素始终为
名字
(使用
大小
)。如果中间名不能超过1个,则可以执行以下操作:

from pyspark.sql import functions as F
from pyspark.sql.functions import *

df.withColumn("split_list", F.split(F.col("name"), " ")).withColumn("fn", col("split_list")[0])\
    .withColumn("ln", col("split_list")[F.size("split_list") - 1])\
    .withColumn("mn", when(F.size("split_list")==2, None)\
    .otherwise(col("split_list")[1])).drop("split_list").show()
+---+----------------+-----+-------+----+
| id|            name|   fn|     ln|  mn|
+---+----------------+-----+-------+----+
|l03|     Bob K Barry|  Bob|  Barry|   K|
|S20|   Cindy Winston|Cindy|Winston|null|
|l10|Jerry Kyle Moore|Jerry|  Moore|Kyle|
|j31|     Dora Larson| Dora| Larson|null|
+---+----------------+-----+-------+----+
如果可以有多个中间名,则可以在
name
上为
middlename
列使用
substring

df.withColumn("split_list", F.split(F.col("name"), " ")).withColumn("fn", col("split_list")[0])\
    .withColumn("ln", col("split_list")[F.size("split_list") - 1])\
    .withColumn("mn", when(F.size("split_list")==2, None)\
    .otherwise(col('name').substr(F.length("fn")+2, \
    F.length("name")-F.length("fn")-F.length("ln")-2))).drop("split_list").show()
+---+----------------+-----+-------+-----+
| id|            name|   fn|     ln|   mn|
+---+----------------+-----+-------+-----+
|l03|     Bob K Barry|  Bob|  Barry|    K|
|S20|   Cindy Winston|Cindy|Winston| null|
|l10|Jerry Kyle Moore|Jerry|  Moore| Kyle|
|j31|     Dora Larson| Dora| Larson| null|
|A12|     Fn A B C Ln|   Fn|     Ln|A B C|
+---+----------------+-----+-------+-----+

我假设FN是第一个元素,LN是最后一个元素,介于两者之间的是MN。这并不总是正确的,因为人们可以有多个FN/LN。

我检查了我的数据集,如果有中间名,则只有一个中间名。我试过你的方法,效果很好,谢谢。