将Spark Dataframe name列拆分为三列
我在Spark中有一个数据框,列是name,它是一个由空格分隔的字符串,棘手的是一些名称有中间名,而其他名称没有。如何将列拆分为firstname、middlename和lastname?我使用F.split,不知道如何区分中间名和姓氏。我明白我不能在Spark中使用负索引。看看我的样品将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
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。我检查了我的数据集,如果有中间名,则只有一个中间名。我试过你的方法,效果很好,谢谢。