Spark 二次排序

遇到这样的场景,有一个文本里的字段是:日期,名字,数据。需要对名字和日期进行排序,大概的思路就是先将名字排序(其实准确来说是分组),再将日期排序。可以使用下面的方案。

文本

60 53
70 58
20 21
50 51
50 54
60 51

代码

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object TwoSort {
  def main(args: Array[String]): Unit = {
	  val conf = new SparkConf().setAppName("twosort").setMaster("local")
	  val sc = new SparkContext(conf)
	   
	  val file = sc.textFile("file:///d:/test_data/twosort.txt")
	      //排序并二次排序
      val rdd_group = file.map(line => line.split(" ")).map(x => (x(0),x(1))).groupByKey()
      var rdd = rdd_group.sortByKey(true).map(x => (x._1, x._2.toList.sortWith(_>_)))

      
    //按照二元组格式输出
     val rdd2=rdd.flatMap{
      x =>
       val len=x._2.length
       val arr=new Array[(String,String)](len)
        for(i <- 0 until len){
          arr(i)=(x._1,x._2(i))
        }
        arr
    }
    rdd2.foreach(println)
    sc.stop()
  }
}

结果

(20,21)
(50,54)
(50,51)
(60,53)
(60,51)
(70,58)

转载于:https://my.oschina.net/lvyi/blog/909178

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值