Spark的二次排序

1、数据样本:

1 5
2 4
3 6
1 3
2 1
1 14
2 45
4 11
3 23
5 12
6 13

2、排序规则:先按照第一个字符排序,如果第一个相同,再按照第二个字符排序

3、排序后的结果

1 3
1 5
1 14
2 1
2 4
2 45
3 6
3 23
4 11
5 12
6 13

4、spark二次排序实现

4.1、自定义key

package com.test.spark

/**
  * @author admin
  * scala处理二次排序的类
  * 自定义key
  */
class SecondSortByKey(val first: Int, val second: Int) extends Ordered[SecondSortByKey] with Serializable {
  def compare(other: SecondSortByKey): Int = {
    //this关键字可加,也可不加,如果遇到多个变量时,必须添加
    if (this.first - other.first != 0)
      this.first - other.first
    else
      this.second - other.second
  }

  //重写toString方法
  /*override def toString(): String = {
    "first:" + first + " second:" + second
  }*/
}

4.2、二次排序程序编排

package com.test.spark

import org.apache.spark.{SparkConf, SparkContext}

/**
  * @author admin
  * Spark二次排序的具体实现步骤:
  * 第一步: 自定义key 实现scala.math.Ordered接口,和Serializeable接口
  * 第二步:将要进行二次排序的数据加载,按照<key,value>格式的RDD
  * 第三步:使用sortByKey 基于自定义的key进行二次排序
  * 第四步:去掉排序的key,只保留排序的结果
  */
object SparkSecondSortApplication {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("SortSecond").setMaster("local[1]")
    // 获取context
    val sc = new SparkContext(conf)
    // 加载到内存RDD
    val lines = sc.textFile("D:\\SparkDataTest\\sort.txt")
    // map操作,将要进行二次排序的数据加载,按照<key,value>格式的RDD
    val pairs = lines.map { line => {
      val spl = line.split(" ")
      (new SecondSortByKey(spl(0).toInt, spl(1).toInt), line)
    }
    }
    // 使用sortByKey 基于自定义的key进行二次排序, true:升序,false:降序
    val sortPair = pairs.sortByKey(true)

    // map操作,只需要保留排序结果
    val sortResult = sortPair.map(line => line._2)

    sortResult.collect().foreach { x => println(x) }

    // 停止sc
    sc.stop()
  }
}

原文地址:https://www.cnblogs.com/xubiao/p/8185288.html

时间: 2024-10-10 10:27:19

Spark的二次排序的相关文章

Spark用Java实现二次排序的自定义key

本人在研究Spak,最近看了很多网上的对于SPARK用Java实现二次排序的方法,对于自定义key的做法 基本上都是实现Ordered<>接口,重写$greater.$greater$eq.$less.$less$eq.compare.compareTo方法,定义hashCode.equals····· 感觉好麻烦,其实我们自定义key只是用了里面的compareTo方法,其他的$greater.$greater$eq.$less.$less$eq.compare 不用做任何改动,hashCo

使用java 实现二次排序

二次排序工具类: import java.io.Serializable; import scala.math.Ordered; /** * @author 作者 E-mail: * @version 创建时间:2017年8月30日 下午3:48:11 * 类说明 */ //二次排序key public class SecondeIndexSort implements Ordered<SecondeIndexSort>, Serializable{ private static final

3.算子+PV&amp;UV+submit提交参数+资源调度和任务调度源码分析+二次排序+分组topN+SparkShell

1.补充算子 transformations ?  mapPartitionWithIndex 类似于mapPartitions,除此之外还会携带分区的索引值. ?  repartition 增加或减少分区.会产生shuffle.(多个分区分到一个分区不会产生shuffle) 多用于增多分区. 底层调用的是coalesce ?  coalesce(合并) coalesce常用来减少分区,第二个参数是减少分区的过程中是否产生shuffle. true为产生shuffle,false不产生shuff

Spark(二)算子详解

目录 Spark(二)算子讲解 一.wordcountcount 二.编程模型 三.RDD数据集和算子的使用 Spark(二)算子讲解 @ 一.wordcountcount 基于上次的wordcount,我们来写一个wordcountcount,来对wc程序进行第二次计数,我们来分析一下性能. package com.littlepage.wc import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkCon

MapReduce排序之 二次排序

一:背景 Hadoop中虽然有自动排序和分组,由于自带的排序是按照Key进行排序的,有些时候,我们希望同时对Key和Value进行排序.自带的排序功能就无法满足我们了,还好Hadoop提供了一些组件可以让开发人员进行二次排序. 二:技术实现 我们先来看案例需求 #需求1: 首先按照第一列数字升序排列,当第一列数字相同时,第二列数字也升序排列(列之间用制表符\t隔开) [java] view plain copy 3   3 3   2 3   1 2   2 2   1 1   1 MapRed

二叉排序

二叉排序,附带插入,查找和删除值.. /* Author: buer Date: 2017/9/18 11:56:02 */ #include <stdio.h> #include <stdlib.h> typedef struct Tree { int data; struct Tree *lchild; struct Tree *rchild; }Tree; void createBiTree(Tree *root); void insertData(Tree *root, i

Hadoop二次排序及MapReduce处理流程实例详解

一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的,在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求.对于二次排序的实现,网络上已经有很多人分享过了,但是对二次排序的实现原理及整个MapReduce框架的处理流程的分析还是有非常大的出入,而且部分分析是没有经过验证的.本文将通过一个实际的MapReduce二次排序的例子,讲述二次排序的实现和其MapReduce的整个处理流程,并且通过结果和Map.

MapReduce二次排序

本文主要介绍下二次排序的实现方式 我们知道MapReduce是按照key来进行排序的,那么如果有个需求就是先按照第一个字段排序,在第一个字段相等的情况下,按照第二个字段排序,这就是传说中的二次排序. 下面就具体说一下二次排序的实现方式 主要就是4点 1.自定义一个Key 为什么要自定义一个Key,我们知道MapReduce中排序就是按照Key来排序的,我们既然想要实现按照两个字段进行排序,默认的方式肯定是不行的,所以自定义一个新的Key,Key里面有两个属性,也就是我们要排序的两个字段. 首先,

大数据【四】MapReduce(单词计数;二次排序;计数器;join;分布式缓存)

   前言: 根据前面的几篇博客学习,现在可以进行MapReduce学习了.本篇博客首先阐述了MapReduce的概念及使用原理,其次直接从五个实验中实践学习(单词计数,二次排序,计数器,join,分布式缓存). 一 概述 定义 MapReduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE).这样做的好处是可以在任务被分解后,可以通过大量机器进行并行计算,减少整个操作的时间. 适用范围:数据量大,但是数据种类小可以放入内存. 基