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