Обновите набор данных в spark-shell, разбив один элемент на несколько частей и вставив строку для каждой части.

У меня есть вариант использования, когда я храню свои данные в наборе данных. У меня есть столбец, в котором я могу иметь несколько значений в строке, разделенных трубой (|). Итак, типичный ряд выглядит так:

2016/01/01  1/XYZ   PQR M|N|O 

Я хочу, чтобы эта строка была преобразована в 3 строки следующим образом:

2016/01/01  1/XYZ   PQR M
2016/01/01  1/XYZ   PQR N
2016/01/01  1/XYZ   PQR O

Кроме того, не все содержимое в последнем столбце может содержать pipe(|). Некоторые строки могут быть одним из перечисленных выше. Я пытался разделить соответствующий столбец с помощью канала (|), но он выдает ошибку из-за строк, не содержащих канал (|). Я не мог придумать никакого другого решения.

Каков наилучший способ добиться этого, используя искровую оболочку в scala.


person Anant Kumar    schedule 27.04.2017    source источник
comment
вам нужна функция explode.   -  person Pushkr    schedule 28.04.2017


Ответы (1)


Для вашего варианта использования вы должны использовать split и explode (как упоминалось @Pushkr) оба.

df.withColumn("new", split($"col4", "[|:]+")).drop("col4").withColumn("col4", explode($"new")).drop("new").show

Здесь df — это DataFrame, содержащий данные 2016/01/01 1/XYZ PQR M|N|O. Кроме того, чтобы разделить по любому разделителю, вы должны построить шаблон в соответствии с вашими требованиями. Как и в приведенном выше коде, я использую шаблон [|:]+ для разделения строки на | или :.

Например:

2016/01/01,1/XYZ,PQR,M|N|O
2016/02/02,2/ABC,DEF,P:Q:R

Приведет к:

+-----------+------+----+----+
|       col1|  col2|col3|col4|
+-----------+------+----+----+
|2016/01/01 |1/XYZ |PQR |  M |
|2016/01/01 |1/XYZ |PQR |  N |
|2016/01/01 |1/XYZ |PQR |  O |
|2016/02/02 |2/ABC |DEF |  P |
|2016/02/02 |2/ABC |DEF |  Q |
|2016/02/02 |2/ABC |DEF |  R |
+-----------+------+----+----+

Надеюсь, это поможет !

person himanshuIIITian    schedule 28.04.2017
comment
Спасибо. Это было полезно. У меня сейчас новая проблема. Предположим, что для вновь созданных строк я хочу, чтобы один столбец имел определенное значение, а другие - какое-то другое значение. На вашей диаграмме результатов предположим, что col3 является целым числом со значением 10. Итак, в трех строках сначала я хочу, чтобы col3 для строки 1 было равно 10, а для строки 2 и строки 3 - 0. Как бы вы это сделали. - person Anant Kumar; 28.04.2017
comment
@AnantKumar Добро пожаловать! Ах... для вашего второго сценария, не могли бы вы сказать мне условие, на основе которого строка получает значение 10, а другая 0? - person himanshuIIITian; 29.04.2017
comment
Только первая строка должна иметь значение 10, а все остальные должны иметь значение 0. - person Anant Kumar; 01.05.2017