【问题标题】:Split Spark Dataframe name column into three columns将 Spark Dataframe 名称列拆分为三列
【发布时间】:2020-10-27 03:53:57
【问题描述】:

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

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|
+---+----------------+---------+

如何继续拆分?赞赏。

【问题讨论】:

    标签: dataframe pyspark split


    【解决方案1】:

    数组中的第一个元素始终为firstname,最后一个元素为lastname(使用size)。如果中间名不能超过 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|
    +---+----------------+-----+-------+----+
    

    如果可以有超过 1 个中间名,那么您可以在 name 上使用 substring 作为 middlename 列:

    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。

    【讨论】:

    • 我检查了我的数据集,如果有中间名,则只有一个中间名。我试过你的方法,效果很好,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2018-09-29
    • 2016-02-20
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多