Spark Scala 多字段二次排序(三)

前言

前面的文章我们已经使用了很多次sort方法进行排序了,但是如何通过两个字段排序呢?即如果第一个字段的值相同,如何通过另外一个字段排序呢?下面我们将通过一个demo演示如何实现。

Spark Scala多字段二次排序

1
2
3
4
5
6
7
8
9
10
11
12
本地文件(hdfs文件)内容,即第一列为姓名,第二列为分数,第三列为年龄
[root@master201 sortdef]# cat file
lishijia,90,30
john,86,30
eva,62,30
jake,90,23
steven,68,34
ada,62,23
evma,96,25
alina,88,30
[root@master201 bin]# ./spark-submit --class lishijia.spark.demo.sort.MoreSort --master local[2] ../demo/spark-scala-demo.jar 100
以上通过本地的方式提交任务,执行结果如下

  • MoreSortKey:Scala通过继承Ordered实现Serializable的方式实现排序功能,输入两个字段(也可以多更多的字段实现排序)
  • textFile:通过SparkContext的textFile函数加载本地源文件
  • map:还是通过map函数转换sort需要的数据结构,相当于转换的数据还是(key,value),因为后续的sort是需要依赖key的,只是此处的key为MoreSortKey对象,而value则是原值。此处先获取到每一行,然后组装MoreSortKey对象
  • sortByKey:根据key排序,但是此处的排序规则是自定义的
  • map:获取需要的数据,即从元组里面取第二个(原始行数据)
  • collect:最后收集然后再调用println函数标准输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package lishijia.spark.demo.sort

class MoreSortKey(val first:Int, val second:Int)
extends Ordered [MoreSortKey] with Serializable{

override def compare(that: MoreSortKey): Int ={
if(this.first - that.first != 0){
this.first - that.first
}else{
this.second - that.second
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package lishijia.spark.demo.sort
import org.apache.spark.{SparkConf, SparkContext}

/**
* 二次排序,对文件中的多列排序
*/
object MoreSort {

def main(args: Array[String]): Unit = {

val conf = new SparkConf().setAppName("MoreSort")
val sc = new SparkContext(conf)
val lines = sc.textFile("file:////home/lishijia/Documents/spark/sortdef/file", 1)
val sortedResult = lines.map(line=>(new MoreSortKey(line.split(",")(1).toInt,
line.split(",")(2).toInt),line))
.sortByKey(false)
.map(sortedLine =>sortedLine._2)
sortedResult.collect().foreach (println)
}

}

总结

即通过自定义排序规则实现多列的排序,这么几个示例下来。发现当中的这些函数就是在做数据的不停转换,为下一步的数据转换做准备,即spark的初级使用方法就是需要把这些函数灵活转换使用,多练习即可。

代码:https://github.com/lishijia/spark-scala-demo/tree/master/src/main/scala/lishijia/spark/demo

Centos虚拟机安装&NAT网络配置

Hadoop2.7.2集群安装

Scala & Spark2.0.2集群安装

Spark Scala WrodCount 入门(一)

Spark Scala 统计多个文件中的最大值与最小值 map自定义函数实现(二)

分享到 评论