当前位置: 首页 > news >正文

大数据面试题:说下Spark中的Transform和Action,为什么Spark要把操作分为Transform和Action?

面试题来源:

《大数据面试题 V4.0》

大数据面试题V3.0,523道题,679页,46w字

可回答:Spark常见的算子介绍一下

参考答案:

我们先来看下Spark算子的作用:

下图描述了Spark在运行转换中通过算子对RDD进行转换。 算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作。

输入:在Spark程序运行中,数据从外部数据空间(如分布式存储:textFile读取HDFS等,parallelize方法输入Scala集合或数据)输入Spark,数据进入Spark运行时数据空间,转化为Spark中的数据块,通过BlockManager进行管理。

运行:在Spark数据输入形成RDD后便可以通过变换算子,如filter等,对数据进行操作并将RDD转化为新的RDD,通过Action算子,触发Spark提交作业。 如果数据需要复用,可以通过Cache算子,将数据缓存到内存。

输出:程序运行结束数据会输出Spark运行时空间,存储到分布式存储中(如saveAsTextFile输出到HDFS),或Scala数据或集合中(collect输出到Scala集合,count返回Scala int型数据)。

1、Transform和Action

Transformation是得到一个新的RDD,但并不立即执行计算,只是记录下这个操作。方式很多,比如从数据源生成一个新的RDD,从RDD生成一个新的RDD。

Action是指触发对RDD进行计算的操作,得到一个值,或者一个结果(直接将RDD cache到内存中)。

因为所有的Transformation都是采用的懒策略,就是如果只是将Transformation提交是不会执行计算的,计算只有在Action被提交的时候才被触发。这样有利于减少内存消耗,提高了执行效率。

2、算子原理

1)Transformation

map(func):返回一个新的分布式数据集,由每个原元素经过func函数转换后组成。

filter(func):返回一个新的数据集,由经过func函数后返回值为true的原元素组成。

flatMap(func):类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素)。

union(otherDataset):返回一个新的数据集,由原数据集和参数联合而成。

groupByKey([numTasks]):在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。注意:默认情况下,使用8个并行任务进行分组,你可以传入numTask可选参数,根据数据量设置不同数目的Task。

reduceByKey(func, [numTasks]):在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。和groupbykey类似,任务的个数是可以通过第二个可选参数来配置的。

join(otherDataset, [numTasks]):在类型为(K,V)和(K,W)类型的数据集上调用,返回一个(K,(V,W))对,每个key中的所有元素都在一起的数据集。

2)Action

reduce(func):通过函数func聚集数据集中的所有元素。Func函数接受2个参数,返回一个值。这个函数必须是关联性的,确保可以被正确的并发执行。

collect():在Driver的程序中,以数组的形式,返回数据集的所有元素。这通常会在使用filter或者其它操作后,返回一个足够小的数据子集再使用,直接将整个RDD集Collect返回,很可能会让Driver程序OOM。

count():返回数据集的元素个数。

foreach(func): 在数据集的每一个元素上,运行函数func。这通常用于更新一个累加器变量,或者和外部存储系统做交互。

http://www.lryc.cn/news/119842.html

相关文章:

  • 【图像去噪的扩散滤波】基于线性扩散滤波、边缘增强线性和非线性各向异性滤波的图像去噪研究(Matlab代码实现)
  • python函数、运算符等简单介绍2(无顺序)
  • k8s 自身原理 3
  • SpringBoot 3自带的 HTTP 客户端工具
  • Spring Boot多级缓存实现方案
  • 机器学习笔记:李宏毅chatgpt 大模型 大资料
  • 2023年中国智慧公安行业发展现况及发展趋势分析:数据化建设的覆盖范围不断扩大[图]
  • Apache Dubbo概述
  • React UI组件库
  • 计算机科学的伟大变革:从机械计算到人工智能
  • 微服务详解
  • Python爬虫的requests(学习于b站尚硅谷)
  • PHP最简单自定义自己的框架view使用引入smarty(8)--自定义的框架完成
  • 字符串的常用操作
  • 开启想象翅膀:轻松实现文本生成模型的创作应用,支持LLaMA、ChatGLM、UDA、GPT2、Seq2Seq、BART、T5、SongNet等模型,开箱即用
  • 文心一言 VS 讯飞星火 VS chatgpt (74)-- 算法导论7.2 2题
  • 大数据第二阶段测试
  • 06 为什么需要多线程;多线程的优缺点;程序 进程 线程之间的关系;进程和线程之间的区别
  • datax-web报错收集
  • YOLO相关原理(文件结构、视频检测等)
  • 深入解析Spring Boot的核心特性与示例代码
  • 什么是Java中的观察者模式?
  • 无涯教程-Perl - endhostent函数
  • Vue2使用easyplayer
  • Map映射学习
  • 【每日一题Day292】LC1572矩阵对角线元素的和 模拟
  • Mongodb:业务应用(2)
  • DSO学习笔记
  • 【Windows 常用工具系列 5 -- 如何在网页(CSDN)中实现右上角及右下角数字显示】
  • sql注入--报错注入