斯卡拉按键排序输出,然后按字母顺序
问题描述:
我正在尝试我的第一个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)
}
}
有人可以帮助我的字母排序为其中的数值是相同的线路?
答
通常Scala为sortByKey
等方法提供并使用隐式的Ordering
,但您也可以构造一个自定义的并明确传递它。 Ordering
特质和伴侣对象为此提供了一些有用的方法。你可以这样做:
val ord = Ordering.Tuple2(Ordering[Int].reverse, Ordering[String])
val freq = words.takeOrdered(kValue.toInt)(ord).map(_.swap)