Переименование строк в определенном столбце в общее имя — pyspark

#apache-spark #pyspark #apache-spark-sql

Вопрос:

У меня есть название столбца «страна», и в этом столбце у меня около 20 стран, однако они написаны на разных языках, поэтому несколько раз встречаются на разных языках. Например, Швейцария фигурирует как Suiza, Schweiz, Suisse и Швейцария.

Как переименовать дублированные страны в столбце «страна» под общим названием Швейцария, сохранив при этом значения в других столбцах?

Комментарии:

1. где у вас хранятся альтернативные имена, т. е. Suiza, Schweiz, Suisse для Switzerland чего ?

2. Все названия стран находятся в колонке «страна». Просто на нескольких языках

3. есть ли в вашем наборе данных еще один столбец, указывающий, на каком языке написано название каждой страны или предпочтительное название страны? Существуют ли какие-либо другие аналогичные/общие значения в наборе данных?

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

Ответ №1:

Просто используйте CASE утверждение:

 df = spark.sql(
SELECT 
  CASE 
    WHEN country IN ('Suiza', 'Schweiz', 'Suisse','Switzerland')
    THEN 'Switzerland'
    WHEN ... -- other translations
    ELSE country
  END AS country,
  ... -- other columns
FROM your_table
)
 

Ответ №2:

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

 countryList = [
    ("Suiza",),
    ("Allemagne",),
    ("Schweiz",),
    ("Suisse",),
    ("Switzerland",),
    ("Suisse",),
    ("Suisse",),
    ("Germany",)
    ]

schema = ["country",]
df_countries = spark.createDataFrame(data=countryList, schema = schema)

countryMap = [
    ("Suiza","CH"),
    ("Schweiz","CH"),
    ("Suisse","CH"),
    ("Switzerland","CH"),
    ("Germany","DE"),
    ("Allemagne","DE")
    ]

schema = ["country","unified_country"]
df_map = spark.createDataFrame(data=countryMap, schema = schema)

df_countries.show()
df_map.show()

df_result=(df_countries
          .join(df_map,on="country",how="left")
          )

df_result.show()
 

выглядит так

  ----------- --------------- 
|    country|unified_country|
 ----------- --------------- 
|      Suiza|             CH|
|    Schweiz|             CH|
|    Germany|             DE|
|     Suisse|             CH|
|     Suisse|             CH|
|     Suisse|             CH|
|  Allemagne|             DE|
|Switzerland|             CH|
 ----------- ---------------