2017-10-05 229 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)