一、前述

Spark中默认有两大类算子,Transformation(转换算子),懒执行。action算子,立即执行,有一个action算子 ,就有一个job。

通俗些来说由RDD变成RDD就是Transformation算子,由RDD转换成其他的格式就是Action算子。

二、常用Transformation算子

假设数据集为此:

1、filter

     过滤符合条件的记录数,true保留,false过滤掉。

Java版:

package com.spark.spark.transformations;

import org.apache.spark.SparkConf;
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.VoidFunction;
/**
* filter
* 过滤符合符合条件的记录数,true的保留,false的过滤掉。
*
*/
public class Operator_filter {
public static void main(String[] args) {
/**
* SparkConf对象中主要设置Spark运行的环境参数。
* 1.运行模式
* 2.设置Application name
* 3.运行的资源需求
*/
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("filter");
/**
* JavaSparkContext对象是spark运行的上下文,是通往集群的唯一通道。
*/
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<String> lines = jsc.textFile("./words.txt");
JavaRDD<String> resultRDD = lines.filter(new Function<String, Boolean>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Boolean call(String line) throws Exception {
return !line.contains("hadoop");//这里是不等于
} }); resultRDD.foreach(new VoidFunction<String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void call(String line) throws Exception {
System.out.println(line);
}
});
jsc.stop();
}
}

scala版:

函数解释:

进来一个String,出去一个Booean.

结果:

 2、map

将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。

特点:输入一条,输出一条数据。

/**
* map
* 通过传入的函数处理每个元素,返回新的数据集。
* 特点:输入一条,输出一条。
*
*
* @author root
*
*/
public class Operator_map {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("map");
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<String> line = jsc.textFile("./words.txt");
JavaRDD<String> mapResult = line.map(new Function<String, String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public String call(String s) throws Exception {
return s+"~";
}
}); mapResult.foreach(new VoidFunction<String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void call(String t) throws Exception {
System.out.println(t);
}
}); jsc.stop();
}
}

函数解释:

进来一个String,出去一个String。

函数结果:

 

 3、flatMap(压扁输出,输入一条,输出零到多条)

先map后flat。与map类似,每个输入项可以映射为0到多个输出项。

package com.spark.spark.transformations;

import java.util.Arrays;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.VoidFunction; /**
* flatMap
* 输入一条数据,输出0到多条数据。
* @author root
*
*/
public class Operator_flatMap {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("flatMap"); JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<String> lines = jsc.textFile("./words.txt");
JavaRDD<String> flatMapResult = lines.flatMap(new FlatMapFunction<String, String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Iterable<String> call(String s) throws Exception { return Arrays.asList(s.split(" "));
} });
flatMapResult.foreach(new VoidFunction<String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void call(String t) throws Exception {
System.out.println(t);
}
}); jsc.stop();
}
}

函数解释:

进来一个String,出去一个集合。

Iterater 集合
iterator 遍历元素

函数结果:

4、sample(随机抽样)

随机抽样算子,根据传进去的小数按比例进行又放回或者无放回的抽样。(True,fraction,long)

True 抽样放回

Fraction 一个比例 float 大致 数据越大 越准确

第三个参数:随机种子,抽到的样本一样 方便测试

package com.spark.spark.transformations;

import java.util.ArrayList;
import java.util.List; 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.PairFlatMapFunction;
import org.apache.spark.api.java.function.VoidFunction; import scala.Tuple2; public class Operator_sample {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("sample"); JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<String> lines = jsc.textFile("./words.txt");
JavaPairRDD<String, Integer> flatMapToPair = lines.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Iterable<Tuple2<String, Integer>> call(String t)
throws Exception {
List<Tuple2<String,Integer>> tupleList = new ArrayList<Tuple2<String,Integer>>();
tupleList.add(new Tuple2<String,Integer>(t,1));
return tupleList;
}
});
JavaPairRDD<String, Integer> sampleResult = flatMapToPair.sample(true,0.3,4);//样本有7个所以大致抽样为1-2个
sampleResult.foreach(new VoidFunction<Tuple2<String,Integer>>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void call(Tuple2<String, Integer> t) throws Exception {
System.out.println(t);
}
}); jsc.stop();
}
}

函数结果:

 5.reduceByKey

将相同的Key根据相应的逻辑进行处理。

package com.spark.spark.transformations;

import java.util.Arrays;

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.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction; import scala.Tuple2; public class Operator_reduceByKey {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local").setAppName("reduceByKey");
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<String> lines = jsc.textFile("./words.txt");
JavaRDD<String> flatMap = lines.flatMap(new FlatMapFunction<String, String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Iterable<String> call(String t) throws Exception {
return Arrays.asList(t.split(" "));
}
});
JavaPairRDD<String, Integer> mapToPair = flatMap.mapToPair(new PairFunction<String, String, Integer>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Tuple2<String, Integer> call(String t) throws Exception {
return new Tuple2<String,Integer>(t,1);
} }); JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey(new Function2<Integer,Integer,Integer>(){ /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1+v2;
} },10);
reduceByKey.foreach(new VoidFunction<Tuple2<String,Integer>>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void call(Tuple2<String, Integer> t) throws Exception {
System.out.println(t);
}
}); jsc.stop();
}
}

函数解释:

函数结果:

 

6、sortByKey/sortBy

作用在K,V格式的RDD上,对key进行升序或者降序排序。

Sortby在java中没有

package com.spark.spark.transformations;

import java.util.Arrays;

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.FlatMapFunction;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.api.java.function.VoidFunction; import scala.Tuple2; public class Operator_sortByKey {
public static void main(String[] args) {
SparkConf conf = new SparkConf();
conf.setMaster("local");
conf.setAppName("sortByKey");
JavaSparkContext jsc = new JavaSparkContext(conf);
JavaRDD<String> lines = jsc.textFile("./words.txt");
JavaRDD<String> flatMap = lines.flatMap(new FlatMapFunction<String, String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Iterable<String> call(String t) throws Exception {
return Arrays.asList(t.split(" "));
}
});
JavaPairRDD<String, Integer> mapToPair = flatMap.mapToPair(new PairFunction<String, String, Integer>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<String, Integer>(s, 1);
}
}); JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey(new Function2<Integer, Integer, Integer>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1+v2;
}
});
reduceByKey.mapToPair(new PairFunction<Tuple2<String,Integer>, Integer, String>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Tuple2<Integer, String> call(Tuple2<String, Integer> t)
throws Exception {
return new Tuple2<Integer, String>(t._2, t._1);
}
}).sortByKey(false).mapToPair(new PairFunction<Tuple2<Integer,String>, String, Integer>() {//先把key.value对调,然后排完序后再对调回来 false是降序,True是升序 /**
*
*/
private static final long serialVersionUID = 1L; @Override
public Tuple2<String, Integer> call(Tuple2<Integer, String> t)
throws Exception {
return new Tuple2<String,Integer>(t._2,t._1);
}
}).foreach(new VoidFunction<Tuple2<String,Integer>>() { /**
*
*/
private static final long serialVersionUID = 1L; @Override
public void call(Tuple2<String, Integer> t) throws Exception {
System.out.println(t);
}
});
}
}

代码解释:先对调,排完序,在对调过来

代码结果:

【Spark篇】---Spark中Transformations转换算子的更多相关文章

  1. Spark—RDD编程常用转换算子代码实例

    Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U]  ...

  2. Spark中RDD转换成DataFrame的两种方式(分别用Java和Scala实现)

    一:准备数据源     在项目下新建一个student.txt文件,里面的内容为: ,zhangsan, ,lisi, ,wanger, ,fangliu, 二:实现 Java版: 1.首先新建一个s ...

  3. HBase读写的几种方式(二)spark篇

    1. HBase读写的方式概况 主要分为: 纯Java API读写HBase的方式: Spark读写HBase的方式: Flink读写HBase的方式: HBase通过Phoenix读写的方式: 第一 ...

  4. Spark调研笔记第6篇 - Spark编程实战FAQ

    本文主要记录我使用Spark以来遇到的一些典型问题及其解决的方法,希望对遇到相同问题的同学们有所帮助. 1. Spark环境或配置相关 Q: Sparkclient配置文件spark-defaults ...

  5. 【转帖】HBase读写的几种方式(二)spark篇

    HBase读写的几种方式(二)spark篇 https://www.cnblogs.com/swordfall/p/10517177.html 分类: HBase undefined 1. HBase ...

  6. spark教程(四)-SparkContext 和 RDD 算子

    SparkContext SparkContext 是在 spark 库中定义的一个类,作为 spark 库的入口点: 它表示连接到 spark,在进行 spark 操作之前必须先创建一个 Spark ...

  7. Spark中文指南(入门篇)-Spark编程模型(一)

    前言 本章将对Spark做一个简单的介绍,更多教程请参考:Spark教程 本章知识点概括 Apache Spark简介 Spark的四种运行模式 Spark基于Standlone的运行流程 Spark ...

  8. 【转载】Spark学习——spark中的几个概念的理解及参数配置

    首先是一张Spark的部署图: 节点类型有: 1. master 节点: 常驻master进程,负责管理全部worker节点.2. worker 节点: 常驻worker进程,负责管理executor ...

  9. 大数据基础知识问答----spark篇,大数据生态圈

    Spark相关知识点 1.Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduce的通用的并行计算框架 dfsSpark基于mapredu ...

随机推荐

  1. IIS处理并发请求设置

    一个ASP.NET项目在部署到生产环境时,当用户并发量达到200左右时,IIS出现了明显的请求排队现象,发送的请求都进入等待,无法及时响应,系统基本处于不可用状态.   当发现请求明显延迟,没有被即时 ...

  2. keepalived安装与配置,组建高可用服务器

    一.准备环境 linux系统:CentOS7 keepalived版本:keepalived-1.3.5.tar.gz keepalived下载地址:http://www.keepalived.org ...

  3. 使用Tornado异步接入第三方(支付宝)支付

    目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...

  4. JSP(二):JSP九大内置对象、四个作用域对象

    jsp的九大内置对象:        内置对象:            jsp文件在转译成其对应的Servlet文件的时候自动生成的并声明的对象.我们在jsp页面中直接使用即可.        注意: ...

  5. 记录几个爬取动态网页时的问题(下拉框,旧的元素无法获取,获取的源代码和f12看到的不一致,爬取延迟)

    更新.....这个动态网页其实直接抓取ajax请求就可以了,很简单,我之前想复杂了,虽然也实现了,但是效率极低,不过没关系,就当作是对Selenium的一次学习吧 1.最近在爬取一个动态网页,其中为了 ...

  6. Unity Bolt插件 基本使用

    1.Bolt的安装和配置 导入插件后可以看到 设置命名方式,左侧:普通人,右侧: 程序员 设置变量类型(可以手动添加自己自定义的类型) 然后点击生成,等待bolt编译生成. 2.创建一个流程并使用 如 ...

  7. linux 存在多个版本的情况下,切换python版本

    linux 存在多个版本的情况下 python 命令默认寻找 /usr/bin下的命令 所以先find / -name python* 找一下所有的Python版本 然后 sudo ln /usr/b ...

  8. Linux 体系结构

    Linux 体系结构 Linux 嵌入式系统的组成 层次结构图   bios 1.硬件检测 2.初始化系统设备 3.装入os 4.调os向硬件发出的指令 bsp 板级支持包 硬件相关 开发板原理图 开 ...

  9. [Ubuntu]修改文件夹及所有子文件夹权限

    sudo chmod -R 777 FILE_NAME 使FILE_NAME文件或文件夹具有读写和执行的权限.

  10. JUC

    1.Java JUC简介 在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异 ...