2017-10-05 174 views
0

我正在尝试我的第一个Scala程序来排序以下输出,以便当值是相同的时候,单词按字母顺序排序。斯卡拉按键排序输出,然后按字母顺序

cookie 8 
document 6 
function 5 
name 5 
start 5 

我当前的代码如下:

object Problem1{ 
    def main(args: Array[String]){ 
    val inputFile = args(0) 
    val outputFolder = args(1) 
    val kValue = args(2) 
    val conf = new SparkConf().setAppName("Problem1").setMaster("local") 
    val sc = new SparkContext(conf) 
    val input = sc.textFile(inputFile) 
    val words = input.flatMap(line => line.toLowerCase().split([\\s*&#^'''\\,..:;?!\\[\\](){}<>~\\-_]+")) 
    .filter(x => x.matches("[A-Za-z]+")&& x.length >2) 
    .map(word => (word,1)).reduceByKey(_+_).map(_.swap) 
    val freq = words.sortByKey(false,1).map(_.swap).take(kValue.toInt) 
    val topKrdd = sc.parallelize(freq) 
    val tabSeperated = topKrdd.map(f => f._1 +"\t" + f._2) 
    tabSeperated.saveAsTextFile(outputFolder) 
    } 
} 

有人可以帮助我的字母排序为其中的数值是相同的线路?

回答

4

通常Scala为sortByKey等方法提供并使用隐式的Ordering,但您也可以构造一个自定义的并明确传递它。 Ordering特质和伴侣对象为此提供了一些有用的方法。你可以这样做:

val ord = Ordering.Tuple2(Ordering[Int].reverse, Ordering[String]) 
val freq = words.takeOrdered(kValue.toInt)(ord).map(_.swap)