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