Spark Scala中如何按值排序获取键值对的前10个元素?
问题根因
Spark RDD的top(n)方法默认使用元素的自然排序规则取前N条数据。对于(String, Int)类型的二元组,Scala默认的排序规则优先比较第一个元素(键)的字典序,再比较第二个元素(值),直接调用top(10)会覆盖你之前通过sortBy(_._2, false)设置的按值降序规则,导致最终结果按键的ASCII码排序输出。
解决方案
有两种常用修改方式,均可实现按值降序取前10的需求:
方案1:保留sortBy逻辑,将top改为take
你已经通过sortBy(_._2, false)将RDD按值降序排好序,直接调用take(10)取前10条即可,不需要再调用top:
def getActiveTaxis(taxiLines: RDD[Array[String]]): Array[(String, Int)] = { // 为简洁省略初始化代码 val counts = keys.map(x => (x, 1)) val sortedResult = counts.reduceByKey((a, b) => a + b).sortBy(_._2, ascending = false) sortedResult.take(10) }
方案2:省略sortBy,给top传入自定义排序规则
直接给top方法指定按值降序的排序规则,不需要提前做排序,性能更优:
def getActiveTaxis(taxiLines: RDD[Array[String]]): Array[(String, Int)] = { // 为简洁省略初始化代码 val counts = keys.map(x => (x, 1)).reduceByKey(_ + _) // 自定义排序规则:按二元组第二个元素(值)降序 counts.top(10)(Ordering.by[(String, Int), Int](_._2)) }
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

