首页 > 其他分享 >学习笔记4

学习笔记4

时间:2024-01-13 22:36:02浏览次数:26  
标签:val RDD scala 笔记 学习 rdd func 操作

RDD操作
对于RDD而言,每一次转换操作都会产生不同的RDD,供给下一个“转换”使用,转换得到的RDD是惰性求值的,也就是说,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转换操作;

常用的RDD转换操作,总结如下

filter(func)操作:筛选出满足函数func的元素,并返回一个新的数据集

scala> val lines =sc.textFile(file:///usr/local/spark/mycode/rdd/word.txt)

scala> val linesWithSpark=lines.filter(line => line.contains("Spark"))
map(func)操作:map(func)操作将每个元素传递到函数func中,并将结果返回为一个新的数据集

scala> data=Array(1,2,3,4,5)

scala> val rdd1= sc.parallelize(data)

scala> val rdd2=rdd1.map(x=>x+10)
另一个实例:

scala> val lines = sc.textFile("file:///usr/local/spark/mycode/rdd/word.txt")

scala> val words=lines.map(line => line.split(" "))
flatMap(func)操作:拍扁操作

scala> val lines = sc.textFile("file:///usr/local/spark/mycode/rdd/word.txt")

scala> val words=lines.flatMap(line => line.split(" "))

groupByKey()操作:应用于(K,V)键值对的数据集时,返回一个新的(K, Iterable)形式的数据集;

reduceByKey(func)操作:应用于(K,V)键值对的数据集返回新(K, V)形式数据集,其中每个值是将每个key传递到函数func中进行聚合后得到的结果

RDD持久
Spark RDD采用惰性求值的机制,但是每次遇到行动操作都会从头开始执行计算,每次调用行动操作都会触发一次从头开始的计算,这对于迭代计算而言代价是很大的,迭代计算经常需要多次重复使用同一组数据:

scala> val list = List("Hadoop","Spark","Hive")

scala> val rdd = sc.parallelize(list)

scala> println(rdd.count()) //行动操作,触发一次真正从头到尾的计算

scala> println(rdd.collect().mkString(",")) //行动操作,触发一次真正从头到尾的计算
可以通过持久化(缓存)机制避免这种重复计算的开销,可以使用persist()方法对一个RDD标记为持久化,之所以说“标记为持久化”,是因为出现persist()语句的地方,并不会马上计算生成RDD并把它持久化,而是要等到遇到第一个行动操作触发真正计算以后,才会把计算结果进行持久化,持久化后的RDD将会被保留在计算节点的内存中被后面的行动操作重复使用;

persist()的圆括号中包含的是持久化级别参数,persist(MEMORY_ONLY)表示将RDD作为反序列化的对象存储于JVM中,如果内存不足,就要按照LRU原则替换缓存中的内容;persist(MEMORY_AND_DISK)表示将RDD作为反序列化的对象存储在JVM中,如果内存不足,超出的分区将会被存放在硬盘上;一般而言,使用cache()方法时,会调用persist(MEMORY_ONLY),同时可以使用unpersist()方法手动地把持久化的RDD从缓存中移除。

针对上面的实例,增加持久化语句以后的执行过程如下:

scala> val list = List("Hadoop","Spark","Hive")

scala> val rdd = sc.parallelize(list)

scala> rdd.cache() //会调用persist(MEMORY_ONLY),但是,语句执行到这里,并不会缓存rdd,因为这时rdd还没有被计算生成

scala> println(rdd.count()) //第一次行动操作,触发一次真正从头到尾的计算,这时上面的rdd.cache()才会被执行,把这个rdd放到缓存中

scala> println(rdd.collect().mkString(",")) //第二次行动操作,不需要触发从头到尾的计算,只需要重复使用

标签:val,RDD,scala,笔记,学习,rdd,func,操作
From: https://www.cnblogs.com/liucaizhi/p/17963124

相关文章

  • 大三寒假学习进度笔记4
    今日学习时间两小时,开始学习RDD的内容,学习了RDD的创建和RDD算子的定义分类RDD学习:RDD五大特征:RDD是有分区的分区是RDD数据存储的最小单位计算方法会作用到每一个分区上RDD之间是由相互依赖的关系的KV型RDD可以有分区器KV型RDD:存储的数据是二元元组RDD分区数据的读取会尽......
  • 2024/1/13 算法笔记
    1.二分查找的原则当要查找的值target>mid就在mid和right中查找当要查找的值target<mid就在left和mid中查找对于边界条件的处理:while(l<r)mid的取值是[l,r)重点是下面部分,直接决定使用哪个二分模板。1.3中间值归属问题这个问题其实比较灵活,这里我只讨论3种情况,其余情况......
  • Python学习笔记
    Python学习因为我之前使用Python复现算法,所以环境早已经进行了配置要点简介脚本语言是一种介乎于HTML和诸如JAVA、VisualBasic、C++等编程语言之间的一种特殊的语言,尽管它更接近后者,但它却不具有编程语言复杂、严谨的语法和规则。有一些脚本语言已经发生了变化,如Py......
  • 微软企业库Unity学习笔记(一)
    微软企业库Unity学习笔记(一) 本文主要介绍:关于Unitycontainer配置,注册映射关系、类型,单实例、已存在对象和指出一些container的基本配置,这只是我关于Unity的学习心得和笔记,希望能够大家多交流相互学习到更多知识,谢谢大家的支持。我们可以通过以下两种方法给Unitycontain......
  • 微软企业库Unity学习笔记(二)
    微软企业库Unity学习笔记(二) 接下来介绍一下依赖注入的方式:构造函数注入属性注入方法注入一、构造函数注入我们将介绍单构造函数和多构造函数注入1)单构造函数使用自动注入单构造函数自动注入,这里我们使用一个简单的例子具体类MyObject依赖于具体类MyDependentC......
  • 学习进度笔记2
    frompysparkimportSparkConf,SparkContext#创建sparkconf对象conf=SparkConf().setMaster("local[*]").setAppName("test_app")#基于sparkconf对象创建sparkContext对象sc=SparkContext(conf=conf)##########基本结构#map计算#rdd=sc.parallelize([1,2,3,4,5])#......
  • kepware关于U-CON的使用笔记 (串口_非主动问答式)
            8,新建两个变量t1,t2 (均为6字节的字符串)用来存储接收到的关键数据;   9,内容接收及解析逻辑     11 测试成功图片展示   ......
  • Anaconda使用笔记
    一、常用命令1.1查看当前conda所有环境condainfo--envs1.2创建新环境condacreate-n环境名python=x.x1.3进入你的环境Condaactivate环境名Sourceactivate环境名activate+环境名1.4查看当前环境中的包Condalistpiplist1.5在你的环境中安装包Co......
  • 深入学习数据库事务
    什么是数据库事务事务(Transaction):一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在计算机术语中,事务通常就是指数据库事务,是逻辑上的一组数据库操作,要么都执行,要么都不执行。例子:假如A要给B转账500元,这个转账会涉及......
  • 《Java编程思想第四版》学习笔记54--关于UncaughtExceptionHandler
    Java中在处理异常的时候,通常的做法是使用try-catch-finally来包含代码块,但是Java自身还有一种方式可以处理——使用UncaughtExceptionHandler。它能检测出某个线程由于未捕获的异常而终结的情况。当一个线程由于未捕获异常而退出时,JVM会把这个事件报告给应用程序提供的UncaughtExce......