Pyspark:基于空格和连字符将多个值从列提取到新列中

bwntbbo3  于 12个月前  发布在  Spark
关注(0)|答案(2)|浏览(152)

我有一个带有forenames列的字符串。我必须创建一个新列first_name,它在第一个空格之前有第一个字符串,或者如果连字符出现在forenames中第一个空格之前的第一个字符串中。

|forenames        | first_name |
+--------+---------------------+
|IVO-KAI ROGERS   |  IVO-KAI   |
|DYLAN STUART JOHN|  DYLAN     |
|JOSH JACK        |  JOSH      |
|MONALISA ELIEN   |  MONALISA  |
|RACHEL- GREEN JOE|RACHEL-GREEN|

字符串
我必须创建另一个新的列middle_name,它将在第一个空格后面跟着first_name的forenames中包含第二个字符串。预期输出将是:

|forenames        | first_name | middle_name |
+--------+---------------------+-------------+
|IVO-KAI ROGERS   |  IVO-KAI   | ROGERS      |
|DYLAN STUART JOHN|  DYLAN     | STUART JOHN |
|JOSH JACK        |  JOSH      | JACK        |
|MONALISA ELIEN   |  MONALISA  | ELIEN       |
|RACHEL- GREEN JOE|RACHEL-GREEN| JOE         |

rryofs0p

rryofs0p1#

要根据第一次出现的空格将forenames列拆分为first_name和last_name,可以在Spark SQL中使用SPLIT和SUBSTRING_INDEX函数。下面是如何实现的。

scala> val dfa = spark.sql("SELECT  forenames, SUBSTRING_INDEX(forenames, ' ', 1) AS first_name, SUBSTRING(forenames, LENGTH(SUBSTRING_INDEX(forenames, ' ', 1)) + 2) AS last_name FROM df")
dfa: org.apache.spark.sql.DataFrame = [forenames: string, first_name: string ... 1 more field]

scala> dfa.show(false)

+-----------------+----------+-----------+
|forenames        |first_name|last_name  |
+-----------------+----------+-----------+
|IVO-KAI ROGERS   |IVO-KAI   |ROGERS     |
|DYLAN STUART JOHN|DYLAN     |STUART JOHN|
|JOSH JACK        |JOSH      |JACK       |
|MONALISA ELIEN   |MONALISA  |ELIEN      |
+-----------------+----------+-----------+

字符串

yyhrrdl8

yyhrrdl82#

你可以使用下面的pyspark代码来拆分第一列,并创建两个新闻列:

df.withColumn('first_name', split(df['forenames'], ' ').getItem(0))\
  .withColumn('last_name', concat_ws(" ",split(df['forenames'], ' ').getItem(1), split(df['forenames'], ' ').getItem(2) ))

字符串
最好的问候,侯赛因

相关问题