PySpark: регулярное выражение заменяет группу

#pyspark

#PySpark

Вопрос:

Я пытаюсь объединить две таблицы на основе общего идентификатора, но в этих файлах есть несоответствие в датах, которое я пытаюсь нормализовать.

Учитывая эти данные:

  ------- ------------------- ---------------------------- 
|dataset|id                 |topic                       |
 ------- ------------------- ---------------------------- 
|2020A  |1128290566331031552|papuaNewguineaEarthquake2019|
|2020A  |1128293303659716608|papuaNewguineaEarthquake2019|
|2020A  |1152200235847966726|athensEarthquake2019        |
|2020A  |1152204892083281920|athensEarthquake2019        |
|2020A  |1152220394008522753|athensEarthquake2019        |
 ------- ------------------- ---------------------------- 
  

Как бы я, например, заменил 2019 in papuaNewguineaEarthquake2019 на первые четыре числа значения в dataset столбце, чтобы:

papuaNewguineaEarthquake2019 становится papuaNewguineaEarthquake2020 ?

Другими словами, как мне использовать регулярное выражение для замены подгруппы в одном столбце подгруппой в другом столбце?

Ответ №1:

Вы можете использовать эту expr функцию.

Я использую regexp_extract для извлечения первых 4 цифр из dataset столбца и regexp_replace замены последних 4 цифр topic столбца выводом regexp_extract .

Регулярное выражение для первых 4 цифр: (^[0-9]{4})
Регулярное выражение для последних 4 цифр: ([0-9]{4}$)

 from pyspark.sql.functions import expr

df.withColumn("dataset_year",expr("regexp_extract(dataset, '(^[0-9]{4})')"))
    .withColumn("topic",expr("regexp_replace(topic, '([0-9]{4}$)'
    , dataset_year)")).drop('dataset_year').show(truncate=False)

 ------- ------------------- ---------------------------- 
|dataset|id                 |topic                       |
 ------- ------------------- ---------------------------- 
|2020A  |1128290566331031552|papuaNewguineaEarthquake2020|
|2020A  |1128293303659716608|papuaNewguineaEarthquake2020|
|2020A  |1152200235847966726|athensEarthquake2020        |
|2020A  |1152204892083281920|athensEarthquake2020        |
|2020A  |1152220394008522753|athensEarthquake2020        |
 ------- ------------------- ----------------------------