`
longzhun
  • 浏览: 370110 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spark API 详解/大白话解释 之 map、mapPartitions、mapValues、mapWith、flatMap、flatMapWith、fla

 
阅读更多

map(function) 
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。

举例:

val a = sc.parallelize(1 to 9, 3)
val b = a.map(x => x*2)//x => x*2是一个函数,x是传入参数即RDD的每个元素,x*2是返回值
a.collect
//结果Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
b.collect
//结果Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)

 

当然map也可以把Key变成Key-Value对

val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", " eagle"), 2)
val b = a.map(x => (x, 1))
b.collect.foreach(println(_))
/*
(dog,1)
(tiger,1)
(lion,1)
(cat,1)
(panther,1)
( eagle,1)
*/

 


mapPartitions(function) 
map()的输入函数是应用于RDD中每个元素,而mapPartitions()的输入函数是应用于每个分区

package test

import scala.Iterator

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object TestRdd {
  def sumOfEveryPartition(input: Iterator[Int]): Int = {
    var total = 0
    input.foreach { elem =>
      total += elem
    }
    total
  }
  def main(args: Array[String]) {
    val conf = new SparkConf().setAppName("Spark Rdd Test")
    val spark = new SparkContext(conf)
    val input = spark.parallelize(List(1, 2, 3, 4, 5, 6), 2)//RDD有6个元素,分成2个partition
    val result = input.mapPartitions(
      partition => Iterator(sumOfEveryPartition(partition)))//partition是传入的参数,是个list,要求返回也是list,即Iterator(sumOfEveryPartition(partition))
    result.collect().foreach {
      println(_)//6 15
    }
    spark.stop()
  }
}

 


mapValues(function) 
原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。因此,该函数只适用于元素为KV对的RDD

val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", " eagle"), 2)
val b = a.map(x => (x.length, x))
b.mapValues("x" + _ + "x").collect

 

//"x" + _ + "x"等同于everyInput =>"x" + everyInput + "x" 
//结果 
Array( 
(3,xdogx), 
(5,xtigerx), 
(4,xlionx), 
(3,xcatx), 
(7,xpantherx), 
(5,xeaglex) 
)


mapWith和flatMapWith 
感觉用得不多,参考http://blog.csdn.net/jewes/article/details/39896301


flatMap(function) 
与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素

val a = sc.parallelize(1 to 4, 2)
val b = a.flatMap(x => 1 to x)//每个元素扩展
b.collect
/*
结果    Array[Int] = Array( 1, 
                           1, 2, 
                           1, 2, 3, 
                           1, 2, 3, 4)
*/

 


flatMapValues(function)

val a = sc.parallelize(List((1,2),(3,4),(5,6)))
val b = a.flatMapValues(x=>1 to x)
b.collect.foreach(println(_))
/*
(1,1)
(1,2)
(3,1)
(3,2)
(3,3)
(3,4)
(5,1)
(5,2)
(5,3)
(5,4)
(5,5)
(5,6)
*/

 

分享到:
评论

相关推荐

    OpenAI:GPT 最佳实践中文大白话版本.pdf

    【OpenAI:GPT最佳实践中文大白话版本】 OpenAI发布的《GPT最佳实践》文档,旨在提供与ChatGPT等基于GPT技术的模型交互的实用技巧,帮助用户获得更高质量的输出结果。这份文档用通俗易懂的语言编写,适合所有人学习...

    未来力场OpenAIGPT最佳实践中文大白话编译解读版.pdf

    "未来力场OpenAIGPT最佳实践中文大白话编译解读版" 本文档是 OpenAI 官方发布的《GPT 最佳实践》中文大白话编译解读版,旨在帮助用户更好地与 ChatGPT 交互,获取想要的结果。该文档主要涵盖了六大策略概览,包括写...

    ASON技术介绍

    ASON技术介绍,电信内部培训资料 ASON技术介绍,电信内部培训资料

    大白话领域驱动设计DDD视频教程

    视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 第1章 初步了解DDD 课程介绍 抛开杂念,看看传统三层CRUD编程方式 DDD领域驱动设计到底是什么? DDD和传统三层优劣势比较 DDD在国内现象是个什么...

    大白话领域驱动设计视频教程

    给大家分享一套课程——大白话领域驱动设计视频教程

    傅里叶变换(详解、易读)

    傅里叶变换是一种重要的数学工具,特别是在信号处理和图像分析领域有着广泛的应用。它通过将一个函数或信号从时间域转换到频率域,揭示了信号的频率成分和结构。傅里叶变换的基本思想是由法国数学家傅里叶提出的,...

    0040-极智AI-大白话解读Transformer-个人笔记

    0040_极智AI_大白话解读Transformer-个人笔记

    毒鸡汤舔狗社会语录3合1源码.zip

    5. **自定义API**:虽然这个源码不是一个现成的API接口,用户可以根据自己的需求将其改造为API。API(Application Programming Interface)是软件之间交互的一种方式,通常以HTTP请求的形式提供服务。要将此源码转化...

    大白话领域驱动设计视频教程(2021)

    给大家分享一套课程——大白话领域驱动设计视频教程(2021),完整版。 课程全程用大白话讲解,通俗易懂,难理解的知识点,手工画图讲解,确保每个同学都能听懂;另外每个知识点, 我都会以电商业务场景举例带着同学...

    【JavaScript源代码】8个JS的reduce使用实例和reduce操作方式.docx

     这是我大白话的解释,可能还是不容易理解,下面看例子吧 1. 数组累加 数组累加是项目经常遇到的,比如计算商品总价等,使用reduce就可以一行代码搞定,而且不用定义外部变量,reduce是完全无副作用的函数。 // ...

    大白话SVM算法课程

    01_SVM之回顾梯度下降原理02_SVM之回顾有约束的最优化问题03_SVM之回顾有约束的最优化问题-KKT几何解释04_SVM之回顾有约束的最优化问题-KKT数学解释05_SVM之回顾距离公式和感知器模型06_SVM之感知器到SVM的引入07_...

    Java中常用的API— String、Math和System

    Java中常用的API 1. API的概念与作用 API 中文名为应用程序编程接口;是指一些预定的函数。目的是提供应用程序与开发人员基于某软件或某硬件得以访问一组例程的能力,而又无需访问源码或理解工作的细节。 大白话就是...

    OSI七层协议大白话解读.docx

    OSI 七层协议大白话解读 OSI 七层协议是一系列网络协议的总称,它们按照功能不同、分工不同被人为的分层七层。实际上,这七层是不存在的,只是人为的划分而已。每一层都运行不同的协议,协议是标准。七层划分为:...

    大白话讲解JavaScript的Promise

    JavaScript的Promise对象是ES6(ECMAScript 2015)规范中引入的一种用于处理异步操作的方案。Promise代表了某个未来才会结束的事件(通常是一个异步操作),并且允许我们为这个事件的完成指定回调函数。...

    大白话条件随机场--从此彻底理解CRF

    在"大白话条件随机场--从此彻底理解CRF"的资源中,你可能会学到以下核心知识点: 1. **概率图模型基础**:条件随机场属于概率图模型,它描述了随机变量之间的概率分布,通过图结构来表示变量间的关系。在CRF中,...

    Spring Batch批处理详解

    2024最新!一文看懂Spring Batch批处理(大白话版,干货满满), 学习你将收获: 一.系统了解Spring Batch批处理; 二.项目中能熟练使用Spring Batch批处理

    【2018最新最详细】并发多线程教程

    20.并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解 21.线程池ThreadPoolExecutor实现原理 22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类...

    大白话解析模拟退火算法.pdf

    模拟退火算法是一种启发式搜索方法,源自固体物理学中的退火过程,用于解决优化问题。在计算机科学领域,它常被用来寻找复杂问题的全局最优解。算法的基本思想是通过引入随机性,允许在一定程度上接受较差的解决方案...

    大白话GBDT算法-通俗理解GBDT原理

    本课程分为4个模块。 第一个模块通过预测年龄的直观案例理解GBDT算法流程。 第二个模块通过GBDT的三要素:GB(梯度提升),DT(回归树)和Shrinkage...第五个模块通过真实案例讲解GBDT的工作中所用API。 资料: 视频:

Global site tag (gtag.js) - Google Analytics