数据算法 (二次排序):Spark+Scala语言实现

之前用到的是MapReduce 解决二次排序问题,另一种实现方式是利用Spark实现,就简单多了

我们考虑如下数据:

y,2,5
x,1,3
y,1,7
y,1,1
y,3,1
x,3,6
z,1,4
z,2,8
z,3,7
z,4,0
p,2,6
p,4,7
p,1,9
p,6,0
p,7,3

我们希望最终结果是这样 :

首先按字母排序,然后按第一个数字,最后按第三个数字排序

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

/**
 * 实验数据如下:
 * y,2,5
 *  x,1,3
 * y,1,7
 * y,1,1
 * y,3,1
 * x,3,6
 * z,1,4 
 * z,2,8
 * z,3,7
 * z,4,0
 * p,2,6
 * p,4,7
 * p,1,9
 * p,6,0
 * p,7,3
 */
class Text {

  def main(args: Array[String]): Unit = {
    //    if (args.length < 1) {
    //      System.out.print("Usage : SecondarySort <file>")
    //      System.exit(-1)
    //    }

    //    var inputpath = args(0)
    //     System.out.print("args(0) : <file> = " + inputpath)
    var inputpath = "C:/Users/2456910384/Desktop/a.txt"     //輸入文件
    val conf = new SparkConf().setMaster("local").setAppName("My App")
    val sc = new SparkContext(conf)

    val pair = sc.textFile(inputpath, 10)              //初始键值对
    println(pair.collect().mkString(","))

    val map = pair.map(x => (x.split(",")(0),(x.split(",")(1), x.split(",")(2))))  //转化为(x,(1,3))形势
    val temresult = map.groupByKey()                  //按键排序
    val result = temresult.mapValues(f => {      //对键的值排序
      f.toList.sortWith((x,y) => {
        if (x._1==y._1) {
          x._2<y._2
        }else {
          x._1 < y._1
        }
      })
    })
   println(result.collect().mkString("\n"))
   result.saveAsTextFile("")
    
  }
}

输出结果如下:

(x,List((1,3), (2,9), (3,6)))
(y,List((1,1), (1,7), (2,5), (3,1)))
(z,List((1,4), (2,8), (3,7), (4,0)))
(p,List((1,9), (2,6), (4,7), (6,0), (7,3)))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值