一、前述

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

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

二、常用Transformation算子

假设数据集为此:

1、filter

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

Java版:

  1. package com.spark.spark.transformations;
  2.  
  3. import org.apache.spark.SparkConf;
  4. import org.apache.spark.api.java.JavaRDD;
  5. import org.apache.spark.api.java.JavaSparkContext;
  6. import org.apache.spark.api.java.function.Function;
  7. import org.apache.spark.api.java.function.VoidFunction;
  8. /**
  9. * filter
  10. * 过滤符合符合条件的记录数,true的保留,false的过滤掉。
  11. *
  12. */
  13. public class Operator_filter {
  14. public static void main(String[] args) {
  15. /**
  16. * SparkConf对象中主要设置Spark运行的环境参数。
  17. * 1.运行模式
  18. * 2.设置Application name
  19. * 3.运行的资源需求
  20. */
  21. SparkConf conf = new SparkConf();
  22. conf.setMaster("local");
  23. conf.setAppName("filter");
  24. /**
  25. * JavaSparkContext对象是spark运行的上下文,是通往集群的唯一通道。
  26. */
  27. JavaSparkContext jsc = new JavaSparkContext(conf);
  28. JavaRDD<String> lines = jsc.textFile("./words.txt");
  29. JavaRDD<String> resultRDD = lines.filter(new Function<String, Boolean>() {
  30.  
  31. /**
  32. *
  33. */
  34. private static final long serialVersionUID = 1L;
  35.  
  36. @Override
  37. public Boolean call(String line) throws Exception {
  38. return !line.contains("hadoop");//这里是不等于
  39. }
  40.  
  41. });
  42.  
  43. resultRDD.foreach(new VoidFunction<String>() {
  44.  
  45. /**
  46. *
  47. */
  48. private static final long serialVersionUID = 1L;
  49.  
  50. @Override
  51. public void call(String line) throws Exception {
  52. System.out.println(line);
  53. }
  54. });
  55. jsc.stop();
  56. }
  57. }

scala版:

函数解释:

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

结果:

 2、map

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

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

  1. /**
  2. * map
  3. * 通过传入的函数处理每个元素,返回新的数据集。
  4. * 特点:输入一条,输出一条。
  5. *
  6. *
  7. * @author root
  8. *
  9. */
  10. public class Operator_map {
  11. public static void main(String[] args) {
  12. SparkConf conf = new SparkConf();
  13. conf.setMaster("local");
  14. conf.setAppName("map");
  15. JavaSparkContext jsc = new JavaSparkContext(conf);
  16. JavaRDD<String> line = jsc.textFile("./words.txt");
  17. JavaRDD<String> mapResult = line.map(new Function<String, String>() {
  18.  
  19. /**
  20. *
  21. */
  22. private static final long serialVersionUID = 1L;
  23.  
  24. @Override
  25. public String call(String s) throws Exception {
  26. return s+"~";
  27. }
  28. });
  29.  
  30. mapResult.foreach(new VoidFunction<String>() {
  31.  
  32. /**
  33. *
  34. */
  35. private static final long serialVersionUID = 1L;
  36.  
  37. @Override
  38. public void call(String t) throws Exception {
  39. System.out.println(t);
  40. }
  41. });
  42.  
  43. jsc.stop();
  44. }
  45. }

函数解释:

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

函数结果:

 

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

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

  1. package com.spark.spark.transformations;
  2.  
  3. import java.util.Arrays;
  4.  
  5. import org.apache.spark.SparkConf;
  6. import org.apache.spark.api.java.JavaRDD;
  7. import org.apache.spark.api.java.JavaSparkContext;
  8. import org.apache.spark.api.java.function.FlatMapFunction;
  9. import org.apache.spark.api.java.function.VoidFunction;
  10.  
  11. /**
  12. * flatMap
  13. * 输入一条数据,输出0到多条数据。
  14. * @author root
  15. *
  16. */
  17. public class Operator_flatMap {
  18. public static void main(String[] args) {
  19. SparkConf conf = new SparkConf();
  20. conf.setMaster("local");
  21. conf.setAppName("flatMap");
  22.  
  23. JavaSparkContext jsc = new JavaSparkContext(conf);
  24. JavaRDD<String> lines = jsc.textFile("./words.txt");
  25. JavaRDD<String> flatMapResult = lines.flatMap(new FlatMapFunction<String, String>() {
  26.  
  27. /**
  28. *
  29. */
  30. private static final long serialVersionUID = 1L;
  31.  
  32. @Override
  33. public Iterable<String> call(String s) throws Exception {
  34.  
  35. return Arrays.asList(s.split(" "));
  36. }
  37.  
  38. });
  39. flatMapResult.foreach(new VoidFunction<String>() {
  40.  
  41. /**
  42. *
  43. */
  44. private static final long serialVersionUID = 1L;
  45.  
  46. @Override
  47. public void call(String t) throws Exception {
  48. System.out.println(t);
  49. }
  50. });
  51.  
  52. jsc.stop();
  53. }
  54. }

函数解释:

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

Iterater 集合
iterator 遍历元素

函数结果:

4、sample(随机抽样)

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

True 抽样放回

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

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

  1. package com.spark.spark.transformations;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. import org.apache.spark.SparkConf;
  7. import org.apache.spark.api.java.JavaPairRDD;
  8. import org.apache.spark.api.java.JavaRDD;
  9. import org.apache.spark.api.java.JavaSparkContext;
  10. import org.apache.spark.api.java.function.PairFlatMapFunction;
  11. import org.apache.spark.api.java.function.VoidFunction;
  12.  
  13. import scala.Tuple2;
  14.  
  15. public class Operator_sample {
  16. public static void main(String[] args) {
  17. SparkConf conf = new SparkConf();
  18. conf.setMaster("local");
  19. conf.setAppName("sample");
  20.  
  21. JavaSparkContext jsc = new JavaSparkContext(conf);
  22. JavaRDD<String> lines = jsc.textFile("./words.txt");
  23. JavaPairRDD<String, Integer> flatMapToPair = lines.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {
  24.  
  25. /**
  26. *
  27. */
  28. private static final long serialVersionUID = 1L;
  29.  
  30. @Override
  31. public Iterable<Tuple2<String, Integer>> call(String t)
  32. throws Exception {
  33. List<Tuple2<String,Integer>> tupleList = new ArrayList<Tuple2<String,Integer>>();
  34. tupleList.add(new Tuple2<String,Integer>(t,1));
  35. return tupleList;
  36. }
  37. });
  38. JavaPairRDD<String, Integer> sampleResult = flatMapToPair.sample(true,0.3,4);//样本有7个所以大致抽样为1-2个
  39. sampleResult.foreach(new VoidFunction<Tuple2<String,Integer>>() {
  40.  
  41. /**
  42. *
  43. */
  44. private static final long serialVersionUID = 1L;
  45.  
  46. @Override
  47. public void call(Tuple2<String, Integer> t) throws Exception {
  48. System.out.println(t);
  49. }
  50. });
  51.  
  52. jsc.stop();
  53. }
  54. }

函数结果:

 5.reduceByKey

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

  1. package com.spark.spark.transformations;
  2.  
  3. import java.util.Arrays;
  4.  
  5. import org.apache.spark.SparkConf;
  6. import org.apache.spark.api.java.JavaPairRDD;
  7. import org.apache.spark.api.java.JavaRDD;
  8. import org.apache.spark.api.java.JavaSparkContext;
  9. import org.apache.spark.api.java.function.FlatMapFunction;
  10. import org.apache.spark.api.java.function.Function2;
  11. import org.apache.spark.api.java.function.PairFunction;
  12. import org.apache.spark.api.java.function.VoidFunction;
  13.  
  14. import scala.Tuple2;
  15.  
  16. public class Operator_reduceByKey {
  17. public static void main(String[] args) {
  18. SparkConf conf = new SparkConf();
  19. conf.setMaster("local").setAppName("reduceByKey");
  20. JavaSparkContext jsc = new JavaSparkContext(conf);
  21. JavaRDD<String> lines = jsc.textFile("./words.txt");
  22. JavaRDD<String> flatMap = lines.flatMap(new FlatMapFunction<String, String>() {
  23.  
  24. /**
  25. *
  26. */
  27. private static final long serialVersionUID = 1L;
  28.  
  29. @Override
  30. public Iterable<String> call(String t) throws Exception {
  31. return Arrays.asList(t.split(" "));
  32. }
  33. });
  34. JavaPairRDD<String, Integer> mapToPair = flatMap.mapToPair(new PairFunction<String, String, Integer>() {
  35.  
  36. /**
  37. *
  38. */
  39. private static final long serialVersionUID = 1L;
  40.  
  41. @Override
  42. public Tuple2<String, Integer> call(String t) throws Exception {
  43. return new Tuple2<String,Integer>(t,1);
  44. }
  45.  
  46. });
  47.  
  48. JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey(new Function2<Integer,Integer,Integer>(){
  49.  
  50. /**
  51. *
  52. */
  53. private static final long serialVersionUID = 1L;
  54.  
  55. @Override
  56. public Integer call(Integer v1, Integer v2) throws Exception {
  57. return v1+v2;
  58. }
  59.  
  60. },10);
  61. reduceByKey.foreach(new VoidFunction<Tuple2<String,Integer>>() {
  62.  
  63. /**
  64. *
  65. */
  66. private static final long serialVersionUID = 1L;
  67.  
  68. @Override
  69. public void call(Tuple2<String, Integer> t) throws Exception {
  70. System.out.println(t);
  71. }
  72. });
  73.  
  74. jsc.stop();
  75. }
  76. }

函数解释:

函数结果:

 

6、sortByKey/sortBy

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

Sortby在java中没有

  1. package com.spark.spark.transformations;
  2.  
  3. import java.util.Arrays;
  4.  
  5. import org.apache.spark.SparkConf;
  6. import org.apache.spark.api.java.JavaPairRDD;
  7. import org.apache.spark.api.java.JavaRDD;
  8. import org.apache.spark.api.java.JavaSparkContext;
  9. import org.apache.spark.api.java.function.FlatMapFunction;
  10. import org.apache.spark.api.java.function.Function2;
  11. import org.apache.spark.api.java.function.PairFunction;
  12. import org.apache.spark.api.java.function.VoidFunction;
  13.  
  14. import scala.Tuple2;
  15.  
  16. public class Operator_sortByKey {
  17. public static void main(String[] args) {
  18. SparkConf conf = new SparkConf();
  19. conf.setMaster("local");
  20. conf.setAppName("sortByKey");
  21. JavaSparkContext jsc = new JavaSparkContext(conf);
  22. JavaRDD<String> lines = jsc.textFile("./words.txt");
  23. JavaRDD<String> flatMap = lines.flatMap(new FlatMapFunction<String, String>() {
  24.  
  25. /**
  26. *
  27. */
  28. private static final long serialVersionUID = 1L;
  29.  
  30. @Override
  31. public Iterable<String> call(String t) throws Exception {
  32. return Arrays.asList(t.split(" "));
  33. }
  34. });
  35. JavaPairRDD<String, Integer> mapToPair = flatMap.mapToPair(new PairFunction<String, String, Integer>() {
  36.  
  37. /**
  38. *
  39. */
  40. private static final long serialVersionUID = 1L;
  41.  
  42. @Override
  43. public Tuple2<String, Integer> call(String s) throws Exception {
  44. return new Tuple2<String, Integer>(s, 1);
  45. }
  46. });
  47.  
  48. JavaPairRDD<String, Integer> reduceByKey = mapToPair.reduceByKey(new Function2<Integer, Integer, Integer>() {
  49.  
  50. /**
  51. *
  52. */
  53. private static final long serialVersionUID = 1L;
  54.  
  55. @Override
  56. public Integer call(Integer v1, Integer v2) throws Exception {
  57. return v1+v2;
  58. }
  59. });
  60. reduceByKey.mapToPair(new PairFunction<Tuple2<String,Integer>, Integer, String>() {
  61.  
  62. /**
  63. *
  64. */
  65. private static final long serialVersionUID = 1L;
  66.  
  67. @Override
  68. public Tuple2<Integer, String> call(Tuple2<String, Integer> t)
  69. throws Exception {
  70. return new Tuple2<Integer, String>(t._2, t._1);
  71. }
  72. }).sortByKey(false).mapToPair(new PairFunction<Tuple2<Integer,String>, String, Integer>() {//先把key.value对调,然后排完序后再对调回来 false是降序,True是升序
  73.  
  74. /**
  75. *
  76. */
  77. private static final long serialVersionUID = 1L;
  78.  
  79. @Override
  80. public Tuple2<String, Integer> call(Tuple2<Integer, String> t)
  81. throws Exception {
  82. return new Tuple2<String,Integer>(t._2,t._1);
  83. }
  84. }).foreach(new VoidFunction<Tuple2<String,Integer>>() {
  85.  
  86. /**
  87. *
  88. */
  89. private static final long serialVersionUID = 1L;
  90.  
  91. @Override
  92. public void call(Tuple2<String, Integer> t) throws Exception {
  93. System.out.println(t);
  94. }
  95. });
  96. }
  97. }

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

代码结果:

【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. Extjs6.2 项目学习系列(一)

     1. Extjs开发准备  (1).下载ExtJS  SDK GPL版 (本测试用版本 ext-6.2.0) : https://www.sencha.com/legal/gpl/ (2).下载Se ...

  2. 什么是HTTP及RFC

      HTTP:超文本传输协议(HyperText Transfer Protocol),是互联网上应用最为广泛的一种网络协议. 所有的www文件都必须遵守这个标准.设计HTTP最初的目的是为了提供发布 ...

  3. 乞丐版JAVA扫雷

    事先声明:本人是一位刚接触Java不久的菜鸟,所以代码写的略显臃肿,敬请谅解!这个扫雷是我在暑假时做的,灵感来源于csdn上某位大神的博客,不过我个人实在不喜欢他的代码实现,于是我自己写了一个实现上不 ...

  4. CodeForces - 777B Game of Credit Cards 贪心

    题目链接: http://codeforces.com/problemset/problem/777/B 题目大意: A, B玩游戏,每人一串数字,数字不大于1000,要求每人从第一位开始报出数字,并 ...

  5. Dancing Links 学习笔记

    Dancing Links 本周的AI引论作业布置了一道数独 加了奇怪剪枝仍然TLE的Candy?不得不去学了dlx dlxnb! Exact cover 设全集X,X的若干子集的集合为S.精确覆盖是 ...

  6. kali安装vm tools

    kali安装完毕后第一件事便是安装VMtools,tools能让kali和物理机进行交互,复制粘贴功能等. 在屏幕上会弹出一个光驱,点击进去,进入文件夹 将文件复制到home文件夹下. 1 tar z ...

  7. Dagger2 notes

    Android:dagger2让你爱不释手-基础依赖注入框架篇 Android Dagger2 MVP架构 一看就明白 Dagger2教程六之Component的组织方法(原) Dagger 2从浅到 ...

  8. 禁止字符串 [POJ3691缩减版]

    题意考虑只由'A','G','C','T'四种字符组成的DNA字符串给定一个长度为k的字符串S,计算长度恰好为n的且不包含S的字符串的个数输入结果对10009取膜1<=k<=100,1&l ...

  9. hadoop环境搭建及Wordcount案例实验

    1.Linux环境变量设置 在/etc/profile中添加环境变量 sudo vim /etc/profile PATH=$PATH:/usr/local/hadoop/bin source /et ...

  10. laravel-神奇的服务容器(转)

    原文地址: http://www.insp.top/learn-laravel-container ,转载务必保留来源,谢谢了! 容器,字面上理解就是装东西的东西.常见的变量.对象属性等都可以算是容器 ...