Spark: выравнивание простого многостолбцового фрейма - PullRequest
0 голосов
/ 02 ноября 2018

Как объединить простой (то есть без вложенных структур) фрейм данных в список? Моя проблема заключается в обнаружении всех пар узлов, которые были изменены / добавлены / удалены из таблицы пар узлов.

Это означает, что у меня есть таблица «до» и «после» для сравнения. Объединение данных до и после приводит к строкам, которые описывают, где пара появляется в одном кадре данных, но не в другом.

Example:
+-----------+-----------+-----------+-----------+
|before.id1 |before.id2 |after.id1  |after.id2  |
+-----------+-----------+-----------+-----------+
|       null|       null|         E2|         E3|
|         B3|         B1|       null|       null|
|         I1|         I2|       null|       null|
|         A2|         A3|       null|       null|
|       null|       null|         G3|         G4|

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

{A2,A3,B1,B3,E2,E3,G3,G4,I1,I2}

Потенциальные подходы:

  • Объединение всех столбцов отдельно и отдельно
  • flatMap и отчетливый
  • карта и сглаживание

Поскольку структура хорошо известна и проста, похоже, должно быть столь же простое решение. Какой подход, или другие, был бы самым простым?

Другие заметки

  • Порядок пары id1-id2 важен только для обнаружения изменений
  • Порядок в результирующем списке не важен
  • DataFrame имеет размер от 10 до 100 тыс. Строк
  • Отдельно в результирующем списке приятно иметь, но не обязательно; при условии, что это тривиально с отдельной операцией

1 Ответ

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

Попробуйте выполнить следующее: преобразовать все строки в последовательности, затем собрать все строки, а затем сгладить данные и удалить нулевое значение:

val df = Seq(("A","B"),(null,"A")).toDF 
val result = df.rdd.map(_.toSeq.toList)
   .collect().toList.flatten.toSet - null
...