Свести значение в парном СДР в искре - PullRequest
0 голосов
/ 10 октября 2018

У меня есть парный RDD, который выглядит как

(a1, (a2, a3))
(b1, (b2, b3))
...

Я хочу сгладить значения, чтобы получить

(a1, a2, a3)
(b1, b2, b3)
...

В настоящее время я делаю

rddData.map(x => (x._1, x._2._1, x._2._2))

Есть ли лучший способ выполнить преобразование?Приведенное выше решение становится безобразным, если value содержит много элементов вместо 2.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Нет лучшего способа.1-й ответ эквивалентен:

val abc2 = xyz.map{ case (k, v) => (k, v._1, v._2) }

, что эквивалентно вашему собственному примеру.

0 голосов
/ 10 октября 2018

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

rddData.map { case (a, (b, c)) => (a, b, c) }

Вы также можете дать своим переменным значимые имена, чтобы сделать ваш код самостоятельнодокументирование и использование фигурных скобок означает, что у вас меньше вложенных скобок.

РЕДАКТИРОВАТЬ: шаблон map {case ...} довольно компактен и может использоваться для удивительно глубоких вложенных кортежей, если структура известнаво время компиляции.Если вы абсолютно точно не можете знать структуру кортежа во время компиляции, то вот какой-то хакерский, медленный код, который, вероятно, может сгладить любой произвольно вложенный кортеж ... до тех пор, пока всего не более 23 элементов.Он работает путем рекурсивного преобразования каждого элемента кортежа в список, преобразования его в один список, а затем с помощью страшного отражения конвертирует список обратно в кортеж, как видно здесь .

def flatten(b:Product): List[Any] = { 
  b.productIterator.toList.flatMap {
    case x: Product => flatten(x)
    case y: Any => List(y)
  }
}

def toTuple[Any](as:List[Any]):Product = {
  val tupleClass = Class.forName("scala.Tuple" + as.size)
  tupleClass.getConstructors.apply(0).newInstance(as.map(_.asInstanceOf[AnyRef]):_*).asInstanceOf[Product]
}

rddData.map(t => toTuple(flatten(t)))
...