Spark核心编程:高级编程之二次排序

Spark实现二次排序 大数据实验教学系统练习 Spark实现二次排序二次排序就是对于类型的数据,不但按key排序,而且每个Key对应的value也是有序的。   Spark 二次排序解决方案:   我们只需要将年和月组合起来构成一个Key,将第三列作为value,并使用 groupByKey 函数将同一个Key的所有Value全部分组到一起,然后对同一个Key的所有Value进行排序即可。掌握Spark RDD实现二次排序的方法。   掌握groupBy、orderBy等算子的使用。使用Spark RDD实... 阅读详情

1.案例:

1>按照文件中的第一列排序。
2>如果第一列相同,则按照第二列排序。
3>文件部分数据:
这里写图片描述
4>代码:
Java版:
1)自定义二次排序类:

package cn.spark.study.core;

import java.io.Serializable;

import scala.math.Ordered;

/*
 * 自定义的二次排序
 */
public class SecondarySortKey implements Ordered<SecondarySortKey>, Serializable{

    private static final long serialVersionUID = 1L;
    //首先在自定义key里面,定义需要进行排序的列
    private int first;
    private int second;


    public SecondarySortKey(int first, int second) {
        super();
        this.first = first;
        this.second = second;
    }

    @Override
    public boolean $greater(SecondarySortKey other) {
        if(this.first > other.getFirst()){
            return true;
        } else if(this.first == other.getFirst() &&
                this.second > other.getSecond()){
            return true;
        }
        return false;
    }

    @Override
    public boolean $greater$eq(SecondarySortKey other) {
        if(this.$greater(other)){
            return true;
        }else if (this.first == other.getFirst() &&
                this.second == other.getSecond()) {
            return true;
        }
        return false;
    }

    @Override
    public boolean $less(SecondarySortKey other) {
        if(this.first < other.getFirst()){
            return true;
        } else if(this.first == other.getFirst() &&
                this.second < other.getSecond()){
            return true;
        }
        return false;
    }

    @Override
    public boolean $less$eq(SecondarySortKey other) {
        if(this.$less(other)){
            return true;
        }else if(this.first == other.getFirst() &&
                this.second == other.getSecond()){
            return true;
        }
        return false;
    }

    @Override
    public int compare(SecondarySortKey other) {
        if(this.first - other.getFirst() != 0){
            return this.first - other.getFirst();
        }else{
            return this.second - other.getSecond();
        }
    }

    @Override
    public int compareTo(SecondarySortKey other) {
        if(this.first - other.getFirst() != 0){
            return this.first - other.getFirst();
        } else {
            return this.second - other.getSecond();
        }
    }
    //为要进行排序的多个列,提供getter和setter方法,以及hashcode和equal是方法
    public int getFirst() {
        return first;
    }

    public void setFirst(int first) {
        this.first = first;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + first;
        result = prime * result + second;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        SecondarySortKey other = (SecondarySortKey) obj;
        if (first != other.first)
            return false;
        if (second != other.second)
            return false;
        return true;
    }


}

2)案例实现类:

package cn.spark.study.core;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction;

import scala.Tuple2;


/*
 * 二次排序
 * 1,实现自定义的key,要实现Ordered接口和Serializable接口,在key中实现自己对多列的排序算法
 * 2.将包含文本的RDD,映射成key为自定义key,value为文本的JavaPairRDD
 * 3.使用sortByKey算子按照自定义的key进行排序
 * 4.再次映射,剔除自定义的key,只保留文本行
 */
public class SecondarySort {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf()
                .setAppName("SecondarySort")
                .setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(conf);
        JavaRDD<String>lines = sc.textFile("G://SparkDevel//test//wordCount//data//sort.txt");
        JavaPairRDD<SecondarySortKey, String> pairs = lines.mapToPair(
                new PairFunction<String, SecondarySortKey, String>() {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public Tuple2<SecondarySortKey, String> call(String line) throws Exception {
                        String[] lineSplited = line.split(" ");
                        SecondarySortKey key = new SecondarySortKey(
                                Integer.valueOf(lineSplited[0]),
                                Integer.valueOf(lineSplited[1]));
                        return new Tuple2<SecondarySortKey, String>(key, line);
                    }
        });
        JavaPairRDD<SecondarySortKey, String> sortedPairs = pairs.sortByKey();
        JavaRDD<String> sortedLines = sortedPairs.map(new Function<Tuple2<SecondarySortKey,String>, String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public String call(Tuple2<SecondarySortKey, String> v1) throws Exception {

                return v1._2;
            }
        });
        sortedLines.foreach(new VoidFunction<String>() {
            private static final long serialVersionUID = 1L;

            @Override
            public void call(String v1) throws Exception {
                System.out.println(v1);

            }
        });
        sc.close();
    }
}

Scala版:
1)自定义二次排序类:

package cn.spark.study.core

/**
 * @author Administrator
 */
class SecondSortKey(val first: Int, val second: Int) 
    extends Ordered[SecondSortKey] with Serializable {

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

}

2)案例实现类:

package cn.spark.study.core

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

/**
 * @author Administrator
 */
object SecondSort {

  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
        .setAppName("SecondSort")  
        .setMaster("local")  
    val sc = new SparkContext(conf)

    val lines = sc.textFile("G://SparkDevel//test//wordCount//data//sort.txt", 1)
    val pairs = lines.map { line => (
        new SecondSortKey(line.split(" ")(0).toInt, line.split(" ")(1).toInt),
        line)}
    val sortedPairs = pairs.sortByKey()
    val sortedLines = sortedPairs.map(sortedPair => sortedPair._2)  

    sortedLines.foreach { sortedLine => println(sortedLine) }  
  }

}

结果:
这里写图片描述

【SPARK】知识点全讲解 SPARK知识点全讲解Spark环境部署Spark简介诞生与发展为什么使用SparkSpark优势Spark技术栈Spark架构设计Spark架构核心组件Spark交互工具Spark APISparkContextSparkSessionRDDDataSetDateFrame Spark环境部署 前置条件:完成Scala环境部署 可以参考我的博客:Scala环境部署和简单介绍 然后我们在vmware虚拟机上配置Scala和Spark并初步使用 Spark简介 诞生与发展 诞生于加州大学伯克利分校AMP实 阅读详情

相关推荐

Spark基础全解析

SPARK全解析 标签(空格分隔): Spark SPARK全解析 Spark是什么? Spark 源码编译 Spark本地模式安装配置及Spark Shell基本使用 Spark集群 Spark Application开发、运行及监控(IDEA) Spark 日志监控(HistoryServer)配置 Spark RDD Spark共享变量 Spark 内核 Spark 依赖 Spa...

vinfly_li的博客 2万+

Spark的二次排序解决方案

一、MapReduce/Hadoop的二次排序解决方案(点击打开) 二、Spark的二次排序解决方案 方案1:同(一)的方案1,将一个给定键的所有值读取并缓存到一个List数组(Array)数据结构中,然后对这些值进行排序。如果内存不够放,则无法实现 方案2:同(一)的方案2,“会为自然键增加部分或整个值来创建一个组合键以实现排序目标” 三、代码实现(一):使用Spark

陈杰 1429

c# 向Spark发送信息

c# 向Spark发送信息,直接调用即可 可加入项目中,用于向指定spark发送信息

Spark(java)二次排序

#楔子 学习《数据算法 Hadoop Spark大数据处理技巧》中Spark部分 1 二次排序:简介 ​ 二次排序(secondary sort) 问题是指归约阶段与某个键关联的值排序。有时这也称为值键转换(value-key conversion)。利用二次排序技术,可以传入各个归约器的值完成排序。 ​ 二次排序问题解决方案 ​ 归约器值排序至少有2种方案。这些使用hadoop和Spark...

zhuzi51的专栏 1077

华为HCIP大数据备考实战:从题库精析到834分通关策略

本文详细介绍了华为HCIP大数据认证考试的备考策略,包括题库精析、重点章节突破和考场实战经验。作者以834分的高分通过考试,分享了官方教材的三遍阅读法、自建题库技巧以及各章节核心知识点,帮助考生高效备考并顺利通关。

weixin_29169899的博客 149

Python小波变换实战:用PyCWT分析气候数据(附完整代码)

本文详细介绍了如何使用Python中的PyCWT库进行小波变换分析,特别针对气候数据(如NINO3海温异常数据)的多尺度周期性特征提取。通过完整的代码示例,从数据预处理、小波参数配置到结果可视化,逐步指导读者掌握小波变换在气候研究中的实际应用。

weixin_29088655的博客 281

[Spark的二次排序的实现]

二次排序原理    二次排序就是首先按照第一字段排序,然后再对第一字段相同的行按照第二字段排序,注意不能破坏第一次排序的结果。二次排序技术       假设对应的Key = K有如下值:         (K,V1), (K,V2),…,(K,Vn)     另外假设每个Vi是包含m个属性的一个元组,如下所示:         (Ai1,Ai2,…,Aim)在这里我们希望按Ai1对归约器的元组的值...

程序车轮 1万+

【实战学习(五)】开源项目学习之uWSGI的部署以及配合nginx

文章目录1)uWSGI是什么?1.1 WSGI1.1.1 Application端1.1.2 Server端1.1.3 WSGI中间件1.2 uwgi1.3 uWSGI、WSGI、uwsgi之间的关系*为什么有了uWSGI为什么还需要nginx?2)连接uwsgi和Django*避坑之Windows10安装uWSGI非常极其艰难,最好勿浪费时间,直接转战Linux吧:2.1 uWGI部署2.1.1 在虚拟环境下安装uwsgi:2.1.2 测试uWSGI的运行2.1.3 使用uWSGI运行Django项目2.

黑黑白白君的博客 1507

Spark:高级排序(二次排序)

为了多维的排序,需要考虑多个条件,这要求我们自定义key 1 23 3 22 3 31 1 12 2 11 4 45 二、使用java实现 2.1、自定义key 使用scala.math.Ordered接口,实现Serializable接口 package com.chb.sparkDemo.secondarySort; import java.io.Serializable; ...

不花的花和尚的博客 671

crazyswarm无人机集群搭建笔记(一)资料索引

crazyswarm无人机搭建笔记:资料收集

Coco_range的博客 808

PyTorch复现EEG-TCNet踩坑记:从BCI IV2a数据到TCN块缺失的完整解决方案

本文详细解析了使用PyTorch复现EEG-TCNet模型的全过程,重点解决了BCI IV2a数据集预处理和TCN模块缺失的技术难题。通过标准化数据流程、跨受试者验证策略以及三种因果卷积实现方案,为运动想象分类任务提供完整解决方案,帮助研究者高效实现模型复现与优化。

weixin_30699955的博客 319

28、Spark核心编程之高级编程之二次排序

需求 按照文件中的第一列排序。 如果第一列相同,则按照第二列排序。 文件内容 2 5 3 6 2 4 1 3 1 5 Java实现 自定义的二次排序key /** * 自定义的二次排序key */ public class SecondarySortKey implements Ordered&lt;SecondarySortKey&gt;,Serializable { ...

ZJ__ZFH的博客 1367

NUS-WIDE-10K数据集制作

NUS-WIDE是一个多标签数据集,数据集中一共包含26,9648个样本,可以分为81个类。最近在做跨模态检索项目,发现有很多论文里面都用到了NUS-WIDE-10K数据集,但是在网上也没有搜索到相关的数据集下载链接或者是数据集制作代码,所以自己动手写了一个NUS-WIDE-10K数据集的制作代码。 1.介绍 我在网上找到的最早关于NUS-WIDE-10K数据集描述的论文是:Cross-modal Retrieval with Correspondence Autoencoder。描述如下:作者选择了N

weixin_44012382的博客 4200

Spark核心编程之排序及取前几数字

基于排序机制的wordcount程序. java package cn.spark.study.core; import java.util.Arrays; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.Ja...

maenlai0086的博客 691

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

语音增强评价指标全解析:从MOS到eSTOI的实战指南

本文全面解析了语音增强领域的核心评价指标,包括主观评价的黄金标准MOS,以及PESQ、STOI、eSTOI等关键客观指标。文章详细阐述了各指标的原理、适用场景与实战计算方法,并提供了Python代码示例,旨在帮助开发者和研究者建立科学的评估体系,以平衡语音可懂度与音质,从而优化算法效果。

yhn456789的博客 1199

Spark3——核心编程

Spark核心编程Spark核心编程行动算子序列化RDD依赖关系RDD持久化RDD分区器RDD文件读取与保存 Spark核心编程 行动算子 (1)reduce 聚集 RDD 中的所有元素,先聚合分区内数据,再聚合分区间数据。 (2)collect 在驱动程序中,以数组 Array 的形式返回数据集的所有元素。 (3)count 返回 RDD 中元素的个数。 (4)first 返回 RDD 中的第一个元素。 (5)take 返回一个由 RDD 的前 n 个元素组成的数组。 (6)takeOrdered 返回该

qq_42873479的博客 1997

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

核心知识——Spark的Why&How

核心知识——Spark的Why&How:本文主要介绍了 Spark 的核心优势和常用编程语言选择,并详细讲解了 Spark 伪分布式应该如何部署运行。

从知识输入到知识输出 2445

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spark 核心编程(9)- 二次排序

1 二次排序 按照文件的第一列排序 如果第一列相同,则按照第二列排序 1.1 Java 版本 1. 实现自定义的key,要实现 Ordered接口和 Serializable 接口,在 key 中实现自己对多个列的排序算法 2. 将包含文本的 RDD,映射成key 为自定义的 key,value 为文本的 JavaPairRDD 3. 使用 sortedByKey 算子按照自定义的 key ...

一角残叶的博客 417

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

spark核心原理刨析:案例解析(第2天)

本文主要介绍了,一:1.spark读写hdfs案例2.spark链式编程3.spark排序案例二:环境验证验证spark on yarn 环境三:pyspark程序与spark交互流程四:整理面试题1.请列举常见的RDD算子,以及对应功能2.请列举常见的spark_submit参数,以及对应功能3.请表述下spark中核心概念4.请表述下cluster on yarn集群的执行流程。

syhiiu的博客 2477

Spark RDD编程初级实践

Spark RDD编程初级实践湖工大永远滴神 茂林!!!第一关 数据去重第二个 整合排序第三关 求平均值 湖工大永远滴神 茂林!!! RDD(Resilient Distributed Datasets, 弹性分布式数据集)是Spark最为核心的概念,它是一个只读的、可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,可在多次计算间重用。Spark用Scala语言实现了RDD的API,程序员可以通过调用API实现对RDD的各种操作,从而实现各种复杂的应用。 RDD编程都是从创建RDD开始的,可以通

m0_49972043的博客 4351

27、Spark核心编程之高级编程之基于排序机制的wordcount程序

需求 对文本文件内的每个单词都统计出其出现的次数。 按照每个单词出现次数的数量,降序排序。 Java实现 /** * 排序的wordcount程序 */ public class SortWordCount { public static void main(String[] args) { SparkConf sparkConf = new SparkConf...

ZJ__ZFH的博客 1432

Spark核心编程:高级编程之基于排序机制的wordcount程序

通过一个案例来深入基于排序机制的wordcount程序 案例需求: 1>对文本文件内的每个单词都统计出其出现的次数。 2>按照每个单词出现次数的数量,降序排序。

江南水景 551

Spark RDD编程实战:多文件全局排序与位次生成

本文详细介绍了使用Spark RDD实现多文件全局排序与位次生成的实战方法。通过解析分布式环境下的数据加载、清洗、排序及位次生成等核心步骤,帮助开发者高效处理大规模数据排序需求,特别适用于电商排行榜、金融统计分析等场景。

weixin_30617695的博客 612

Spark编程基础

Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎特点:运行速度快、容易使用、通用性、运行模式多样。

Xiaozou_Q的博客 1564
上一篇: Spark核心编程:高级编程之基于排序机制的wordcount程序
下一篇: Spark核心编程:高级编程之topn
VectorYang
博客等级 码龄10年 17粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值