Spark基础排序+二次排序(java+scala)

1.基础排序算法
2.二次排序算法
3.更高级别排序
4.排序算法内幕
1.基础排序算法

sc.textFile("/data/putfile.txt").flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_,1).map(pair=>(pair._2,pair._1)).sortByKey(false).map(pair=>(pair._2,pair._1)).collect
//key value交换
sc.setLogLevel("WARN")

2.二次排序算法
所谓二次排序就是指排序的时候考虑两个维度(有可能10次排序)
Java版本

package com.dt.java.spark;

import akka.util.HashCode;
import scala.math.Ordered;

import java.io.Serializable;

//实现Ordered接口(scala的)
public class SecondarySort implements Ordered<SecondarySort>,Serializable {
//自定义二次排序的key
private int first;
private int second;

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;
}

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

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

}

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

@Override
public boolean $greater(SecondarySort that) {

if(this.first > that.getFirst()){
return true;
}else if(this.first == that.getFirst() && this.second > that.second)
{
return true;
}
return false;
}

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

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

@Override
public int compareTo(SecondarySort that) {
if (this.first - that.getFirst()!=0)
{
return this.first - that.getFirst();
}else
{
return this.second - that.getSecond();
}
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

SecondarySort that = (SecondarySort) o;

if (first != that.first) return false;
return second == that.second;

}

@Override
public int hashCode() {
int result = first;
result = 31 * result + second;
return result;
}
}
package com.dt.java.spark;

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;

//二次排序,具体实现步骤
//第一步:按照Ordered和Serrializable接口实现自定义排序的Key
//第二步:将要进行二次排序的文件加载进来生成《key,value》类型的RDD
//第三步:使用sortByKey基于自定义的Key进行二次排序
//第四步:去除掉排序的key,,只保留排序结果
public class SecondarySortApp {
public static void main(String[] args){

SparkConf conf = new SparkConf().setAppName("SecondarySortApp").setMaster("local");
JavaSparkContext sc = new JavaSparkContext(conf);

JavaRDD lines = sc.textFile("D:\\JavaWorkspaces\\sparkproject\\sparktest.txt");

JavaPairRDD,String> pairs = lines.mapToPair(new PairFunction, SecondarySort, String>() {
@Override
public Tuple2, String> call(String line) throws Exception {
String[] splited = line.split(" ");
SecondarySort key = new SecondarySort(Integer.valueOf(splited[0]),Integer.valueOf(splited[1]));
return new Tuple2, String>(key,line);
}
}
);

JavaPairRDD,String> sorted = pairs.sortByKey();//完成二次排序
//过滤掉排序后自定的key,保留排序的结果
JavaRDD secondarysorted = sorted.map(new Function, String>, String>() {
@Override
public String call(Tuple2, String> sortedContent) throws Exception {
return sortedContent._2();
}
}
);
//
secondarysorted.foreach(new VoidFunction() {
@Override
public void call(String sorted) throws Exception {
System.out.println(sorted);
}
});
}
}//生成默认的构造器

Scala版本

package com.dt.scala.spark



class SecondarySort(val first:Int, val second:Int) extends Ordered[SecondarySort] with Serializable{
override def compare(that: SecondarySort): Int = {
if(this.first - that.first != 0)
{
this.first - that.first
}else {
this.second - that.second
}

}
}

package com.dt.scala.spark

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


object SecondarySortApp {
def main (args: Array[String]) {
//第一步;创建spark的配置对象sparkconf

val conf = new SparkConf()//创建sparkconf对象
conf.setAppName("SecondarySortApp")//设置应用程序的名称
conf.setMaster("local")//设置本地运行

//创建sparkcontext对象,sparkcontext是程序的唯一入口

val sc = new SparkContext(conf)

val lines = sc.textFile("D:\\JavaWorkspaces\\sparkproject\\sparktest.txt")

val pairWithSortkey = lines.map(line =>(
new SecondarySort( line.split(" ")(0).toInt,line.split(" ")(1).toInt),line
))

val sorted = pairWithSortkey.sortByKey(false)

val sortedResult = sorted.map(sortedline => sortedline._2)
sortedResult.collect.foreach(println)
}
}

作业2:阅读RangePartitioner源码
1、scala 实现二次排序 2;自己阅读RangePartitioner

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark本地开发环境搭建需要以下步骤: 1. 安装Java JDK和Scala:首先需要安装Java JDK和Scala,可以从官网下载安装包进行安装。 2. 安装Maven:Maven是一个项目管理工具,可以从官网下载安装包进行安装。 3. 下载Spark:从官网下载Spark的二进制包,解压到本地目录。 4. 配置环境变量:将JavaScala和Maven的bin目录添加到系统环境变量中。 5. 配置Spark:在Spark的conf目录下,将spark-env.sh.template文件复制一份并重命名为spark-env.sh,然后编辑该文件,设置JAVA_HOME、SCALA_HOME和SPARK_HOME等环境变量。 6. 编写Spark应用程序:使用ScalaJava编写Spark应用程序,并使用Maven进行依赖管理和打包。 7. 运行Spark应用程序:使用spark-submit命令提交Spark应用程序,即可在本地运行Spark应用程序。 以上就是Spark本地开发环境搭建的步骤。 ### 回答2: Spark是一个用于大数据处理的强大框架,但在开始实际工作之前,首先需要为Spark构建本地开发环境。在本文中,我将向您介绍如何搭建基于Maven、ScalaJava的本地Spark开发环境。 第一步:安装Java Spark依赖于Java进行开发和运行。因此,必须先安装Java。您可以从Oracle官网下载Java JDK。安装完成后,请确保已将JAVA_HOME环境变量设置为JDK的安装路径。 第二步:安装Scala Scala是一种支持面向对象和函数式编程的高级编程语言。在Spark开发中,Scala最常用。要安装Scala,请按照Scala官方安装指南安装Scala,并将其放入系统路径中。 第三步:安装Maven Maven是Java项目的依赖管理器。它可以下载项目所需的所有依赖项,并将它们自动放置在项目的类路径下,以加速开发和构建过程。请前往Maven官方网站下载并安装Maven,并将其添加到系统路径中。 第四步:下载SparkSpark官网下载Spark。解压缩下载的Spark二进制文件并将其放入系统路径中。 第五步:创建示例应用程序 在本地实例中创建一个Spark示例应用程序。为此,首先创建一个Maven项目,并将以下依赖项添加到项目的POM.xml文件中: ``` <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.10</artifactId> <version>1.6.1</version> </dependency> ``` 使用Scala创建Spark应用程序,并将其保存在src/main/scala目录下: ``` import org.apache.spark.{SparkConf, SparkContext} object ExampleApp { def main(args: Array[String]) { val conf = new SparkConf().setAppName("ExampleApp").setMaster("local[2]") val sc = new SparkContext(conf) val data = Array(1, 2, 3, 4, 5) val rdd = sc.parallelize(data) val result = rdd.reduce(_ + _) println(result) sc.stop() } } ``` 第六步:构建项目 使用Maven进行构建,编译并将项目打包成jar文件。要构建项目,请在项目根目录下运行以下命令: ``` mvn package ``` 第七步:运行Spark应用程序 在项目目录中,使用以下命令运行Spark应用程序: ``` ./bin/spark-submit --class ExampleApp target/ExampleApp-1.0-SNAPSHOT.jar ``` 恭喜!你已经成功地创建了一个基于Maven、ScalaJava的本地Spark开发环境。现在您可以使用您的Spark应用程序和环境去探索和开发更多有趣的大数据应用程序。 ### 回答3: Spark是一个专门针对大规模数据处理的计算引擎,其本身需要依赖于JavaScala等编程语言来实现数据处理的应用,因此需要在本地搭建开发环境来进行Spark的开发。 以下是搭建Spark本地开发环境的步骤: 第一步:安装Java开发环境(JDK) 在Spark中,需要使用Java 8或更高版本,因此需要在本地安装Java开发环境。为了避免不同版本之间的冲突,建议使用Oracle JDK。 第二步:安装Scala ScalaSpark的支持语言之一,因此需要安装Scala。你可以在Scala官网上选择合适的版本来进行安装。安装Scala之后可以使用命令行来测试Scala是否成功。 第三步:安装Maven Maven是一个项目管理和构建工具,用于处理依赖关系,并生成可执行的Jar包。在Spark的开发过程中通常使用Maven进行依赖管理和打包。你可以在Maven官网上下载安装包,安装完成后可使用命令行测试Maven是否成功。 第四步:安装Spark 安装Spark需要先下载Spark源代码包,选择合适的版本进行下载,并解压缩。之后在命令行中输入mvn package -DskipTests来构建Spark。构建完成后即可在target文件夹下找到生成的Spark应用包。 第五步:验证安装 在安装完成后,可以使用IDE(如IntelliJ IDEA)或者命令行来验证是否安装成功。在IDE中,可以创建一个Scala项目并导入Spark的相关依赖后,编写Spark应用程序来进行测试。在命令行中,可以使用spark-shell命令进入交互模式来执行Spark相关命令,验证是否成功。 总结: 以上就是Spark本地开发环境搭建的步骤。虽然过程比较繁琐,但只需要按照以上步骤进行安装,就能轻松地搭建起一个Spark本地开发环境。在上述环境下,你可以进行Spark开发和调试,处理大规模数据集。最后需要提醒注意的是,为了保证Spark应用程序能够正常运行,需要根据实际需要选择适当的硬件和软件资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值