2016-02-15 5 views
0

У меня есть данные в следующем формате:Спарк проблема преобразования РДД

Я использую следующий код, чтобы загрузить его:

val data : RDD[(String, Array[Int])] = sc.textFile("data.txt").map(line => ((line.split("\t"))(0), (line.split("\t"))(1).split(" ").map(_.toInt))) 

Я хочу, чтобы генерировать пар из Array [Int], так что элемент массива со значением больше числа (2 в следующем коде) соединяется со всеми другими элементами массива. Затем я буду использовать это для создания дополнительных статистических данных. Например, с данными образца я должен был бы сгенерировать это сначала:

100 (3,1), (3,2), (3,4), (3,5), (4,1) , (4,2), (4,3), (4,5)

val test = merged_data.mapValues { case x => 
     for (element <- x) { 
     val y = x.filter(_ != element) 

     if (element > 2) 
      { 

      for (yelement <- y) 
       { 
       (element, yelement) 
       } 
      } 
     } 
     } 

Вот о/р, что я получаю: Массив [(String, единицы)] = Array ((100 ,())) Не знаете, почему он пуст.

После того, как я могу решить эту проблему, я буду тогда сортировать элементы в кортеже и удалить дубликаты, если любой так выше о/р

100 (3,1), (3,2), (3,4), (3,5), (4,1), (4,2), (4,3), (4,5)

становится этим:

100 (1,3), (2,3), (3,4), (3,5), (1,4), (2,4), (4,5)

ответ

0

Я был в состоянии решить эту проблему as:

val test = merged_data.mapValues { case x => 
    var sb = new StringBuilder 

    for (element <- x) { 
    val y = x.filter(_ != element) 

    if (element > 2) 
     { 

     for (yelement <- y) 
      { 
      (element, yelement) 
      } 
     } 
    } 
    sb.toString() 
    } 
+0

Вы ничего не делаете с этим StringBuilder? –

0

Как о чем-то вроде:

val test = data.mapValues { x => 
    for { 
     element <- x.filter(_ > 2); 
     yelement <- x.filter(_ != element) 
    } yield (element, yelement) 
} 

Кроме того, вы можете проверить: Nested iteration in Scala, который отвечает, почему вы получили пустой результат.

Смежные вопросы