2017-01-07 2 views
0

ребята У меня есть проблема с комбинациями методовСпарк метод Scala комбинаций

Мой код:

val myRDD = sc.parallelize(Seq("aaa bbb bbb")) 
 
myRDD: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:27 
 

 
scala> myRDD.foreach{println} 
 
aaa bbb bbb 
 

 
scala> myRDD.map(_.split(" ")).flatMap(_.combinations(2)). 
 
    | map(p=>(p.mkString(","),1)). 
 
    | reduceByKey(_+_). 
 
    | foreach{println} 
 
(aaa,bbb,1) 
 
(bbb,bbb,1)

Я не», почему выход не

(aaa,bbb,2) 
 
(bbb,aaa,2) 
 
(bbb,bbb,1)

ответ

1

The scala documentation охватывает это очень хорошо, я думаю:

перебирает комбинаций. A комбинация длины n является подпоследовательностью исходной последовательности с элементами, принятыми по порядку. Таким образом, «xy» и «yy» являются комбинациями длины-2 «xyy», но «yx» не является. Если существует несколько способов генерации одной и той же подпоследовательности, возвращается только один.

Например, «xyyy» имеет три разных способа генерации «xy» в зависимости от выбора первого, второго или третьего «y». Тем не менее, , поскольку все одинаковы, будет выбран только один. Какое из этих трех будет принято, это деталь реализации, которая не определена.

В вашем конкретном случае это ломается что-то вроде:

(aaa, bbb) 
(aaa, bbb) //Thrown out since it duplicates the first 
(bbb, bbb) 
1

В комбинированной функции, сочетания длиной п является подпоследовательностью исходной последовательности, с элементами, принятых в порядке. Поэтому в вашем случае для (aaa, bbb, bbb) возможные подпоследовательности являются (aaa, bbb) и (bbb, bbb), но не (bbb, aaa).

Пожалуйста, обратитесь scala documentation

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