2015-06-07 2 views
0

Я пытаюсь выполнить все комбинации линий без повторения текстового файла.Искра - комбинации без повторения

Пример:

Результат:

  • Линия 1 с линией 2 = (1,2)
  • линии 1 с линией 3 = (1,2)
  • Линия 1 с линией 4 = (1,1)
  • Линия 1 с линией 5 = (1,1)
  • линия 2 с линией 3 = (2,2)
  • линия 2 с линией 4 = (2,1)
  • линия 2 с линией 5 = (2,1)
  • Линия 3 с линией 4 = (2,1)
  • Строка 3 с линией 5 = (2,1)
  • линия 4 с линией 5 = (1,1)

или

Учитывая (х, у), если 0 еще 1 (х = у!):

Я следующий код:

def processCombinations(rdd: RDD[String]) = { 
    rdd.mapPartitions({ partition => { 
     var previous: String = null; 
     if (partition.hasNext) 
      previous = partition.next 

     for (element <- partition) yield { 
      if (previous == element) 
      "1" 
      else 
      "0" 
     } 
     } 
    }) 
    } 

Кусок кода выше делает комбинации первого элемента моего RDD, другими словами: (1, 2) (1,2) (1,1) (1,1).

Проблема: этот код ТОЛЬКО работает с ОДНОМ РАЗДЕЛОМ. Я хотел бы сделать эту работу со многими разделами, как я могу это сделать?

+0

В вашем примере много повторяющихся комбинаций, которые, как вы говорите, вам не нужны. Кроме того, все после полужирного ** или ** - это своего рода тайна. Не могли бы вы потратить некоторое время, чтобы улучшить свой вопрос? – marios

+0

@marios, комбинации, которые я хочу, рассматривают линии, но получают данные. (1,2) = (1,2) (1,3) = (1,2) (1,4) = (1,1) ... После того, выделены жирным шрифтом, или: , если (x! = y) 0 else 1 – Felipe

+0

Похоже, что для этого потребуется довольно сложная агрегатная функция, так как это не совсем простая задача для распространения из-за требования отслеживать все состояние на самом деле. –

ответ

1

Не совсем понятно, что вы хотите в качестве вывода, но это воспроизводит ваш первый пример и переводит непосредственно на Spark. Он генерирует комбинации, но только там, где индекс первого элемента в исходном списке меньше, чем индекс второго, что я думаю, о чем вы просите.

val r = List(1,2,2,1,1) 
val z = r zipWithIndex 

z.flatMap(x=>z.map(y=>(x,y))).collect{case(x,y) if x._2 < y._2 => (x._1, y._1)} 
//List((1,2), (1,2), (1,1), (1,1), (2,2), (2,1), (2,1), (2,1), (2,1), (1,1)) 

или, как для-понимания

for (x<-z; y<-z; if x._2 < y._2) yield (x._1, y._1) 
+0

Это сработало! Я изучаю Spark и Scala. Моя цель - сравнить эти результаты с другим: Комбинации: (2,1,2,1,1) = [(2,1), (2,2), (2,1), (2,1), (1,2), (1,1), (1,1), (2,1), (2,1), (1,1)] Мой вопрос: когда я передел моего RDD, он не сохраняет порядок моих объектов, перетасовывая результаты. Хотя если мои RDD имеют одинаковый размер, результаты будут соответствовать каждой комбинации? – Felipe

+0

Извините, ничего не знаю о том, как Spark делает переделку. –

+0

Так можно ли отслеживать каждую комбинацию? Например, (1,2) всегда будет первой комбинацией, (1,2) второй, (1,1) третьей и т. Д. – Felipe

0

Этот код вычисления комбинации без повторений путем использования рекурсии. Он получает 2 аргумента: количество элементов для комбинации и список элементов.

Он работает следующим образом: для данного списка: 1, 2, 3, 4, 5 => Он принимает 4 первых элемента для первой комбинации. Затем он генерирует другую комбинацию с 5, последним элементом списка. Когда в списке осталось больше элементов, он перемещает одну позицию назад (третью позицию) и берет следующий элемент для генерирования большего количества комбинаций оттуда: 1, 2, «4», 5. Эта операция выполняется рекурсивно со всеми элементы списка.

def combinator[A](n: Int, list: List[A], acc: List[A]): List[List[A]] = { 
    if (n == 0) 
    List(acc.reverse) 
    else if (list == Nil) 
    List() 
    else 
    combinator(n - 1, list.tail, list.head :: acc) ::: combinator(n, list.tail, acc) 
} 

combinator(4, List(1, 2, 3, 4, 5), List()).foreach(println) 

// List(1, 2, 3, 4) 
// List(1, 2, 3, 5) 
// List(1, 2, 4, 5) 
// List(1, 3, 4, 5) 
// List(2, 3, 4, 5) 
+0

Пожалуйста, старайтесь избегать просто сдачи кода в качестве ответа и попытаться объяснить, что он делает и почему. Ваш код может быть не очевидным для людей, у которых нет соответствующего опыта в кодировании. Измените свой ответ, чтобы включить [пояснение, контекст и попытаться упомянуть любые ограничения, допущения или упрощения в вашем ответе.] (Https://stackoverflow.com/help/how-to-answer) –

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