Как разделить содержимое списка, который является частью кадра данных? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть фрейм данных, где каждая строка представляет собой список пар. Например, у меня есть датафрейм df, который выглядит примерно так:

id | pairs
1  | (a, b), (b, c), (a, c) 
2  | (a, b), (b, d) 
3  | (b, c) 

id: Int
pairs: Array<Struct<String,String>> 

После обработки кадр данных должен выглядеть примерно так:

pairs  |  
(a, b) |
(b, c) |
(a, c) |
(a, b) |
(b, d) |
(b, c) |

Мне действительно не нужен столбец id, поэтому также работает решение, которое отбрасывает все остальные столбцы данных. Также обратите внимание, что дубликаты не могут быть удалены из кадра данных. Если есть 3 экземпляра пары, мне нужны все 3 в новом фрейме данных.

Я пробовал индивидуально перебирать содержимое и добавлять его в глобальный список, но этот подход слишком медленный. (В конце концов я запускаю задание Spark, где мне требуется этот бит для некоторой предварительной обработки.) Существует ли эффективный способ сделать это без необходимости перебирать каждый элемент каждого списка в каждой строке кадра данных?

Цените любую помощь в этом!

1 Ответ

3 голосов
/ 25 июня 2019

Вы можете использовать функцию drop , чтобы удалить столбец id, и Explode , чтобы создать каждый кортеж в другой строке:

val initialDf= ....

val dfAfterDrop=initialDf.drop("id")
val dfAfterExplode = dfAfterDrop.withColumn("pairsExplode", explode($"pairs"))

Теперь вашСтолбец pairsExplode содержит все кортежи, каждый кортеж в отдельном ряду.Вы можете удалить исходный столбец pairs, используя drop снова.


Более элегантный способ - благодаря @Hristo Iliev:

initialDf.select(explode($"pairs") as "pairs")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...