Spark SQL — сбор различных строковых значений

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

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

Вопрос:

У меня есть столбец colors , в котором хранятся названия цветов, разделенные запятыми. В выходных данных мне нужно иметь строку, состоящую из разделенных запятыми различных названий цветов (сгруппированных по id столбцам). Примечание: мне нужно иметь это в Spark SQL.

 spark.sql("""
SELECT id, concat_ws(', ', sort_array( collect_set(colors))) as csv_colors
FROM ( 
  VALUES ('A', 'green'),('A','yellow'),('A','yellow, green, blue'),('B', 'blue'),('B','green') 
) as T (id, colors)
GROUP BY id
""").toPandas()
 

Что я получаю, так это:

 
id  csv_colors
0   B   blue, green
1   A   green, yellow, yellow, green, blue
 

Что мне нужно, так это:

 id  csv_colors
0   B   blue, green
1   A   blue, green, yellow
 

Я был бы признателен за любые подсказки. Спасибо!

Ответ №1:

Сначала вы можете разделить и разделить цвета:

 spark.sql("""
SELECT id, concat_ws(', ', sort_array(collect_set(colors))) as csv_colors 
FROM (
    SELECT id, explode(split(colors, ', ')) colors
    FROM ( 
        VALUES ('A', 'green'),('A','yellow'),('A','yellow, green, blue'),('B', 'blue'),('B','green') 
    ) as T (id, colors)
)
GROUP BY id
""")

 --- ------------------- 
| id|         csv_colors|
 --- ------------------- 
|  B|        blue, green|
|  A|blue, green, yellow|
 --- -------------------