Spark Scala: извлекать отдельные текстовые значения в каждой ячейке

scala #apache-spark #apache-spark-sql

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

Вопрос:

Я новичок в scala, и у меня возникли проблемы с извлечением различных текстовых значений из каждой ячейки строки. Мой фрейм данных выглядит примерно так, как показано ниже. Я намерен устранить дублирующие навыки для каждого идентификатора кандидата.

candidate_id навыки join_date Расположение
1789s3 java; c ; java 2012-09-22 Мумбаи
agduch23 ppt; ppt; майнер 2018-02-02 Banglore
sgdtev office 365; 2019-03-10 Noida

Мой конечный результирующий фрейм данных должен выглядеть примерно так —

candidate_id навыки join_date Расположение
1789s3 java; c 2012-09-22 Мумбаи
agduch23 ppt; майнер 2018-02-02 Banglore
sgdtev office 365; 2019-03-10 Noida

Для этого я использую следующую команду в SQL.

 string_agg(ARRAY_TO_STRING(ARRAY((select distinct skill from unnest(split(skills_agg, '; ')) as skill)), '; ')) as skills_distinct
 

Есть ли способ, которым я могу сделать это в scala без использования sql.

Заранее спасибо

Ответ №1:

Если вы используете Spark версии 3.0 и выше, вы можете удалить дубликаты, разбив строку на массив с split помощью , затем используйте функцию array_distinct для удаления дубликатов и, наконец, перестроить строку с concat_ws помощью, как показано ниже:

 import org.apache.spark.sql.functions.{array_distinct, col, concat_ws, split}

dataframe.withColumn("skills", concat_ws("; ", array_distinct(split(col("skills"), "; ")))
 

Вы можете найти все функции, которые вы можете использовать в Scaladoc функций Scala API