Spark-Transformation以及Action开发实战

news2024/12/23 12:47:00

文章目录

    • 创建RDD
    • Transformation以及Action
    • Transformation开发
    • Action开发
    • RDD持久化
    • 共享变量

创建RDD

  • RDD是Spark的编程核心,在进行Spark编程是,首要任务就是创建一个初始的RDD
  • Spark提供三种创建RDD方式:集合、本地文件、HDFS文件
    • 集合:主要用于本地测试,在实际部署到集群运行之前,自己使用集合构造测试数据,测试Spark流程
    • 本地文件:临时性的处理工作
    • HDFS:最常用的生产上的方式

使用集合创建RDD

  • 通过SparkContext.parallelize方法将集合转化为RDD
  • 通过parallelize方法可以设置RDD的partition数量,Spark会为每一个partition运行一个task来处理


    public static void main(String[] args) {
   
        SparkConf sparkConf = new SparkConf();
        sparkConf.setAppName("CreateRDDArrayJava").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);

        List<Integer> list = Arrays.asList(1, 2, 3, 4);
        JavaRDD<Integer> rdd = sc.parallelize(list, 2);
        Integer sum = rdd.reduce(new Function2<Integer, Integer, Integer>() {
   
            @Override
            public Integer call(Integer v1, Integer v2) throws Exception {
   
                return v1 + v2;
            }
        });
        System.out.println("sum:" + sum);

    }
  def main(args: Array[String]): Unit = {
   
    val conf = new SparkConf();
    conf.setAppName("CreateRDDArray").setMaster("local")
    val context = new SparkContext(conf);
    val arr = Array(1,2,3,4)

    // 集合创建RDD
    val rdd = context.parallelize(arr, 2)
    val sum = rdd.reduce(_ + _)

    println("sum=:" + sum)
  }
  

在这里插入图片描述

使用本地文件以及HDFS文件创建RDD

  • 通过SparkContext.textFile方法创建RDD,这时的RDD就是一行一行的文件数据
  • textFile方法支持针对目录、压缩文件以及通配符的方式
  • 默认会为HDFS文件的每一个Block创建一个partition,也可以通过textFile手动设置分区数量,只能比Block多,不能比Block少

这个可以参考上一篇blog(文件路径可以是hdfs://hadoop01:9000/test/hello,也可以是本地路径):https://blog.csdn.net/Grady00/article/details/136736362

Transformation以及Action

  • Spark支持两种RDD操作:Transformation、Action
    • Transformation可以理解为转换的意思,表示针对RDD数据的一个转换操作,主要对已有的RDD创建一个新的RDD,常见的有MAP,flatMap,filter等。
    • Transformation的特性:lazy,如果一个Spark任务只定义了Transformation算子,即使执行这个任务,任务中的算子也不会真正执行,也就是Transformation算子是不会出发Spark任务执行的,只是记录了对RDD的一些操作,只有进行了Action操作之后所有的Transformation才会真正执行。Spark通过lazy这种特性,来执行底层的Spark任务执行的优化,避免产生过多的中间结果
    • Action可以理解为执行,出发任务执行的操作,主要是对RDD进行最后的操作,比如遍历、reduce、保存到文件等,还可以把结果返回给Driver
    • Action特性:执行Action操作才会出发一个Spark Job的运行,从而触发这个Action之前所有的Transformation操作

不管是Transformation还是Action中的操作,我们都把它称为算子,比如map算子,reduce算子等等

Transformation开发

public static void main(String[] args) {
   
        SparkConf sparkConf = new SparkConf();
        sparkConf.setAppName("TransformationJava").setMaster("local");
        JavaSparkContext sc = new JavaSparkContext(sparkConf);
		
    // 将RDD中的每个元素进行处理,一进一出
        mapOp(sc);
    // 对RDD的每个元素进行判断,返回true则保存
        filterOp(sc);
    // 与map类似,但是每个元素都可以返回一个或多个新元素
        flatMapOp(sc);
    // 根据key进行分组,每个key对应一个Iterable<value>
    //BN:15003 15005 
	//US:150001 15002 
	//IN:15004 	
        groupByKeyOp(sc);
        groupByKeyOp2(sc);
    // 对每个相同的key对应的value进行reduce操作
    //reduceByKeyOp result:(BN,2)
	//reduceByKeyOp result:(US,2)
	//reduceByKeyOp result:(IN,1)
        reduceByKeyOp(sc);
    // 对每个相同的key对应的value进行排序操作
        sortedByKeyOp(sc);
    // 对两个包含<key,value>对的RDD进行join操作
        joinOp(sc);
    // 对RDD中的元素去重
        distinctOp(sc);
    }

    /**
     * 分组
     * @param sc
     */
    private static void groupByKeyOp(JavaSparkContext sc) {
   
        Tuple2<Integer, String> t1 = new Tuple2<>(150001, "US");
        Tuple2<Integer, String> t2 = new Tuple2<>(15002, "US");
        Tuple2<Integer, String> t3 = new Tuple2<>(15003, "BN");
        Tuple2<Integer, String> t4 = new Tuple2<>(15004, "IN");
        Tuple2<Integer, String> t5 = new Tuple2<>(15005, "BN");

        List<Tuple2<Integer, String>> list = Arrays.asList(t1, t2, t3, t4, t5);
        JavaRDD<Tuple2<Integer, String>> rdd = sc.parallelize(list);
        rdd.mapToPair(new PairFunction<Tuple2<Integer, String>, String, Integer>() {
   
            @Override
            public Tuple2<String, Integer> call(Tuple2<Integer, String> tup) throws Exception {
   
                return new Tuple2<>(tup._2, tup._1);
            }
        }).groupByKey().foreach(new VoidFunction<Tuple2<String, Iterable<Integer>>>() {
   
            @Override
            public void call(Tuple2<String, Iterable<Integer>> tup) throws Exception {
   
                String area = tup._1;
                System.out.print(area + ":");
                Iterable<Integer> id = tup._2;
                for (Integer item: id
                     ) {
   
                    System.out.print(item + " ");
                }
                System.out.println();
            }
        });
    }

    /**
     * 拆分
     * @param sc
     */
    private static void flatMapOp(JavaSparkContext sc) {
   
        JavaRDD<String> javaRDD = sc.parallelize(Arrays.asList("good work", "work hard", "tom good", "take it easy"));
        javaRDD.flatMap(new FlatMapFunction<String, String>() {
   
            @Override
            public Iterator<String> call(String line) throws Exception {
   
                String[] words = line.split(" ");

                return Arrays.asList(words).iterator();
            }
        }).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电路方案分析(十八)四开关buck-boost双向同步DC/DC变换器方案

tip是&#xff1a;资料来自网络&#xff0c;仅供学习交流使用&#xff01; 1.概述 4开关降压升压双向DC-DC电源转换器在很多应用中都有使用。作为一个同步降压或同步升压转换器&#xff0c;其中只有两个开关切换&#xff0c;开关损耗减少到一半。只有当直流母线和电池电压彼此…

【MMDetection3D实战5】Dataset 和 model配置文件解析

文章目录 1. Dataset 配置文件解析1. 1 定义全局变量1. 1 数据处理pipeline(1) train_pipeline(2) test_pipeline(3) eval_pipeline1. 2 data 字典的定义2. model 配置文件解析2. 1 体素化voxel_layer2. 2 voxel_encoder2. 3 middle_encoder2. 4 2D 检测网络(backbone + neck …

C++实验 面向对象编程

一、实验目的&#xff1a; 掌握类中静态成员的定义方法&#xff0c;初始化方法&#xff0c;使用方法&#xff1b; 掌握类的友元说明方法&#xff0c;理解友元的使用特点 二、实验内容&#xff1a; 1、编写程序&#xff0c;统计某旅馆住宿客人的总数&#xff0c;要求输入客人…

hot100 -- 矩阵

&#x1f442; Peter Pan - kidult. - 单曲 - 网易云音乐 &#x1f442; Bibliothque&#xff08;图书馆&#xff09; - Jasing Rye - 单曲 - 网易云音乐 目录 &#x1f33c;前言 &#x1f33c;二分模板 &#x1f382;矩阵置零 AC 标记数组 AC 标记变量 &#x1f6a9;…

AI成就画质冠军!海信电视U8N Pro的“硬参数”和“软实力”

不得不说&#xff0c;这几年AI落地大有摧枯拉朽之势&#xff0c;也离普通人的生活越来越近了。 如果说&#xff0c;曾经1997年“深蓝”计算机赢下国际象棋世界冠军&#xff0c;还没那么让人印象深刻&#xff0c;2016年Alpha Go战胜围棋世界冠军&#xff0c;即使广泛关注&#…

replace和replaceAll的区别

replace和replaceAll的区别 replaceAll有些浏览器不兼容,如下图所示 replace的使用1>若只替换一个字符串abc.replace(b,1)//a1cabcaaa.replace(a,1)//1bcaaa2>若替换所有字符串abcaaa.replace(/\a/g,1)//1bc111replaceAll的使用1>若只替换一个字符串abc.replace(b,…

AI智慧校园电子班牌云平台源码

目录 家长端 学校端 电子围栏 亲情通话 课堂答题 移动化管理模式 统一资源管理平台 模板内容智能更换 家校互联 家长端 多场景通话:上学放学联系、紧急遇险求助联系、日常亲情通话关注孩子人身安全:到校离校情况、进入危险区域预警等。 学校端 课堂秩序管理:提高教…

服务器数据恢复—服务器硬盘灯显示红色的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器中有一组由多块硬盘组建的raid阵列&#xff0c;在运行过程中服务器突然崩溃&#xff0c;管理员检查服务器发现该服务器raid阵列中有两块硬盘的指示灯显示红色。于是&#xff0c;管理员重启服务器&#xff0c;服务器重启后&a…

基于Python django的人脸识别门禁系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&…

mac redis启动,redis哨兵模式,redis集群的相关命令

Homebrew安装的软件会默认在/usr/local/Cellar/路径下 redis的配置文件redis.conf存放在/usr/local/etc路径下 cd /usr/local/Cellar/redis/7.0.10. 存在 cd /usr/local/opt/redis/bin/redis-server. 目录存在 cd /usr/local/etc/redis.conf 存在。配置文件 复制文件 cp …

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展&#xff0c;建筑行业也在不断迈向数字化转型的道路。在这个过程中&#xff0c;BIM&#xff08;Building Information Modeling&#xff0c;建筑信息模型&#xff09;技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

MATLAB中visdiff函数用法

目录 语法 说明 示例 比较两个文件 比较两个文件并指定类型 发布比较报告 visdiff函数的功能是比较两个文件或文件夹。 语法 visdiff(filename1,filename2) visdiff(filename1,filename2,type) comparison visdiff(___) 说明 visdiff(filename1,filename2) 打开比较工…

JVM理解学习

参考视频 运行时数据区 JVM架构总览图 绿色的&#xff1a;方法区&#xff0c;堆&#xff0c;是所有线程共享的 黄色的&#xff1a; 虚拟机栈&#xff0c;本地方法栈&#xff0c;程序计数器&#xff0c;是线程私有的 程序计数器 程序计数器是一块较小的内存空间&#xff0c;物…

蓝桥杯单片机快速开发笔记——矩阵键盘

一、原理分析 二、示例框架 定义了四个位控制变量&#xff0c;用于控制键盘扫描时的行列信号。 在Scan_Keys()函数中&#xff0c;首先设置行列信号&#xff0c;将其中一个行信号置为0&#xff0c;另一个行信号置为1&#xff0c;同时将列信号置为1&#xff0c;用于扫描键盘按键…

力扣映射题:机器人能否返回原点

超时太多了&#xff0c;笔者也开始放弃遍历了 bool judgeCircle(char* moves) {int arr[4]{0};for(int x0;x<strlen(moves);x) {if(moves[x]R){arr[0]arr[0]1;}if(moves[x]L){arr[1]arr[1]1;}if(moves[x]U){arr[2]arr[2]1;}if(moves[x]D){arr[3]arr[3]1;}} if(arr[0]-arr[1…

php彩虹/异世界云商全解系统

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式&#xff0c;它允许开发者使用不同的标准来过滤一组对象&#xff0c;并通过逻辑运算以解耦的方式将它们联系起来。 过滤器模式的核心在于提供了一个处理对象的机制&#xff0c;这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应…

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.16 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1&#xff1a;组合总和&#xff1b;2&#xff1a;电话号码的字母组合 216.组合总和III17.电话号码的字母…

快速了解微软推出的开发人员主页的应用

一、概述 开发人员主页是微软推出的一个新的 Windows 控制中心&#xff0c;提供以下功能&#xff1a;使用可自定义小组件监视仪表板中的项目&#xff0c;通过下载应用、包或存储库来设置开发环境&#xff0c;连接到开发人员帐户和工具&#xff08;如 GitHub&#xff09;&#x…

【C++进阶】深度解析AVL树及其简单模拟实现

AVL树的解析和模拟实现 一&#xff0c;什么是AVL树二&#xff0c;AVL树的特性三&#xff0c;模拟实现1. 基本框架2. 插入&#xff08;不带旋转&#xff09;2. AVL树的旋转3. AVL树的验证 四&#xff0c;总结 一&#xff0c;什么是AVL树 之前我们学习了二叉搜索树&#xff0c;但…