Лучший способ извлечь из RDD Iterable в Scala - PullRequest
0 голосов
/ 02 февраля 2019

Если у меня есть следующая функция, и я хочу разделить Iterable на RDD Var1 с массивом Var2, каков наилучший способ сделать это?

Вот моя функция:

def foo(rdds: RDD[(ID, Iterable[(Var1,Var2)])]) : RDD[(Var1,Array[Var2])] = {
   rdds.map(x => (x._2.map(it => it._1).asInstanceOf[Var1], (x._2.map(it => it._2).toArray)))
}

А вот мой пример входных данных:

//RDD[(ID, Iterable[(Var1,Var2)...])]
RDD[("ID1",Iterable[(1,4),(1,8),(1,15)])],
RDD[("ID2",Iterable[(2,18),(2,29)])]

И я хочу, чтобы вывод выглядел так:

//RDD[(Var1,Array[Var2])]
RDD[1,(4,8,15)],
RDD[2,(18,29)]

А пока мой вышекод работает.Кажется, что нет необходимости проходить x._2 дважды, чтобы получить обе части Iterable, и мне не нравится, как я должен явно выполнять преобразование asInstanceOf[Var1], чтобы изменить тип Iterable.

Есть ли лучший способ извлечь элементы из Iterable и поместить их в новый RDD, сгруппированный по Var1?

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете просто изменить способ получения var1.Согласно данным, которые вы показали, значения var1 в Iterable совпадают.Так что не нужно перебирать Iterable дважды.Вы можете сделать что-то вроде:

def foo(rdds: RDD[(ID, Iterable[(Var1,Var2)])]) : RDD[(Var1,Array[Var2])] = {
   rdds.map(x => (x._2.head._1, (x._2.map(it => it._2).toArray)))
}

, что даст требуемый результат.

ПРИМЕЧАНИЕ - Это работает, только если x._2 имеет хотя бы один элемент.Если есть вероятность, что x._2 пусто, то x._2.headOption.getOrElse((defaultVar1, defaultVar2))._1 может быть хорошей идеей.

...