Spark: Свести простой многостолбцовый DataFrame

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

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

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 находится между 10000 и 100 000 строк.
  • отчетливо в результирующем списке хорошо иметь, но не обязательно; при условии, что это тривиально с определенной операцией

1 ответ

Решение

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

val df = Seq(("A","B"),(null,"A")).toDF 
val result = df.rdd.map(_.toSeq.toList)
   .collect().toList.flatten.toSet - null
Другие вопросы по тегам