Spark scala方法组合

时间:2017-01-07 00:19:12

标签: scala apache-spark

伙计我的方法组合有问题

我的代码:



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)
&#13;
&#13;
&#13;

我不会&#39;为什么输出不是

&#13;
&#13;
(aaa,bbb,2)
(bbb,aaa,2)
(bbb,bbb,1)
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

在组合函数中,长度为n的 组合是原始序列的子序列,其元素按顺序。所以在你的情况下,对于(aaa,bbb,bbb),可能的子序列是(aaa,bbb)和(bbb,bbb)但不是(bbb,aaa)。

请参阅scala documentation

答案 1 :(得分:1)

我认为

The scala documentation非常清楚:

  

迭代组合。长度为n的组合是原始序列的子序列,其元素按顺序排列。因此,&#34; xy&#34;和&#34; yy&#34;是&#34; xyy&#34;的长度为2的组合,但是&#34; yx&#34;不是。如果生成相同子序列的方法不止一种,则只返回一个。

     

例如,&#34; xyyy&#34;有三种不同的方式来生成&#34; xy&#34; 取决于第一个,第二个或第三个&#34; y&#34;被选中。但是,因为所有内容都相同,所以只选择一个。将采用三者中的哪一个是未定义的实现细节。

在您的具体情况中,这会分解为:

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