Разделить столбец на несколько строк - PullRequest
0 голосов
/ 04 ноября 2018

Я использую sparkml, и у меня есть данные, как показано ниже в CSV. Первый - это название фильма, а следующие значения - различные полученные оценки. Количество оценок будет отличаться.

например. Титаник, 9,10,8,6,9 Замороженный, 8,8,8 Автомобили, 6,7,8,5

я хочу их как Титаник, 9 Титаник, 10 Титаник, 8 Титаник, 6 Замороженный, 8 Замороженный, 8 Замороженный, 8 Автомобили, 6 Автомобили, 7 Автомобили, 8 Автомобили, 5

Есть идеи, как это сделать. Я посмотрел на функциональность Explode, но это помогло мне в сценарии, где разделитель был другим, как: Titanic, | 9 | 10 | 8 | 6 | 9. Здесь разделитель такой же.

1 Ответ

0 голосов
/ 05 ноября 2018

Так как количество оценок может отличаться для каждого фильма, вы должны читать ваши данные как текстовый файл, а не как CSV. Предполагая, что вы получите DataFrame, содержащий каждую строку файла

val df = Seq(
  "Titanic,9,10,8,6,9",
  "Frozen,8,8,8",
  "Cars,6,7,8,5"
).toDF("line")

Используя простой UDF, разделите каждую строку на две части: фильм и рейтинги. Установив для параметра limit значение 2, мы обеспечиваем разделение только по первому разделителю ,

val splitLine = udf { s : String => s.split(",", 2) }

А затем разделить и взорвать рейтинги

df.withColumn("mr", splitLine($"line"))
  .select(
    $"mr"(0).as("movie"), 
    explode(split($"mr"(1), ",")).as("rating")
  )

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

+-------+------+
|  movie|rating|
+-------+------+
|Titanic|     9|
|Titanic|    10|
|Titanic|     8|
|Titanic|     6|
|Titanic|     9|
| Frozen|     8|
| Frozen|     8|
| Frozen|     8|
|   Cars|     6|
|   Cars|     7|
|   Cars|     8|
|   Cars|     5|
+-------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...