Сворачивание нескольких строк в один ряд и столбец в искре - PullRequest
0 голосов
/ 16 мая 2018

У меня есть искра DF, как показано ниже.Мне нужно свернуть несколько строк с тем же идентификатором, что и одна строка, но значения должны быть разными.

id|values
1 |hello
1 |hello Sam
1 |hello Tom
2 |hello
2 |hello Tom

Ожидаемый результат

id|values
1 |hello, Sam, Tom
2 |hello, Tom

Я закончил с накопительной частью, но какотфильтровать дубликаты токенов?

Текущий код:

df.select("id","values")
  .groupBy("id")
  .agg(concat_ws(",", collect_list("values")))

2-я часть вопроса: Я также пытался через SQL, но отображаются также дубликаты.

spark.sql("select id, concat_ws(' ' ,collect_set(values)) as values from data group by id ").show(false)
+---+----------------------------+
|id |values                      |
+---+----------------------------+
|1  |hello hello Sam hello Tom   |
|2  |hello hello Tom             |
+---+----------------------------+

Как избавиться от дубликатов в приведенном выше запросе

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать collect_set как

df.select("id","values").groupBy("id").agg(concat_ws(",",collect_set("values")))

UPDATE:

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

Вам нужно разделить пробелом и найти отличительные, используя udf, как показано ниже

val tokenize = udf((value: Seq[String]) => {
  value.flatMap(_.split(",|\\s+")).map(_.trim).distinct
})

df.select("id", "values").groupBy("id").agg(collect_list("values").as("value"))
    .withColumn("value1", tokenize($"value"))

.show(false)

Выход:

+---+-----------------+
|id |value            |
+---+-----------------+
|1  |[hello, Sam, Tom]|
|2  |[hello, Tom]     |
+---+-----------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...