Найти подстроку из столбца и записать в новый столбец (поиск по нескольким столбцам) - PullRequest
0 голосов
/ 21 мая 2019

Я новичок в PYSPARK.

Я читаю данные из таблицы и обновляю ту же таблицу.У меня есть требование, где я должен искать небольшую строку в столбцах и, если найден, мне нужно записать это в новый столбец.

Логика такая:

IF 
(Terminal_Region is not NULL & Terminal_Region contains "WC") OR
(Terminal_Footprint is not NULL & Terminal_Footprint contains "WC")
THEN REGION = "EOR"
ELSE
REGION ="WOR"

Если обаиз этих полей имеет значение NULL, тогда REGION = 'NotMapped'

Мне нужно создать новый REGION в Datafarme с помощью PYSPARK.Кто-нибудь может мне помочь?

|Terminal_Region    |Terminal_footprint |   REGION |
+-------------------+-------------------+----------+
|  west street WC   |                   |     EOR  |
| WC 87650          |                   |     EOR  |
| BOULVEVARD WC     |                   |     EOR  |
|                   |                   |Not Mapped|
|                   |landinf dr WC      |     EOR  |
|                   |FOX VALLEY WC 76543|     EOR  |
+-------------------+-------------------+----------+

1 Ответ

0 голосов
/ 21 мая 2019

Я думаю, что следующий код должен создать желаемый результат. Код должен работать с искрой 2.2, которая включает в себя функцию contains.

from pyspark.sql.functions import *
df =  spark.createDataFrame([("west street WC",None),\
                      ("WC 87650",None),\
                      ("BOULVEVARD WC",None),\
                      (None,None),\
                      (None,"landinf dr WC"),\
                      (None,"FOX VALLEY WC 76543")],\
                      ["Terminal_Region","Terminal_footprint"]) #Creating Dataframe
df.show() #print initial df
df.withColumn("REGION", when( col("Terminal_Region").isNull() & col("Terminal_footprint").isNull(), "NotMapped").\  #check if both are Null
otherwise(when((col("Terminal_Region").contains("WC")) | ( col("Terminal_footprint").contains("WC")), "EOR").otherwise("WOR"))).show() #otherwise search for "WC"

Выход:

#initial dataframe
+---------------+-------------------+
|Terminal_Region| Terminal_footprint|
+---------------+-------------------+
| west street WC|               null|
|       WC 87650|               null|
|  BOULVEVARD WC|               null|
|           null|               null|
|           null|      landinf dr WC|
|           null|FOX VALLEY WC 76543|
+---------------+-------------------+
# df with the logic applied
+---------------+-------------------+---------+
|Terminal_Region| Terminal_footprint|   REGION|
+---------------+-------------------+---------+
| west street WC|               null|      EOR|
|       WC 87650|               null|      EOR|
|  BOULVEVARD WC|               null|      EOR|
|           null|               null|NotMapped|
|           null|      landinf dr WC|      EOR|
|           null|FOX VALLEY WC 76543|      EOR|
+---------------+-------------------+---------+
...