map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回

map函数的源码:

def map(self, f, preservesPartitioning=False):
"""
Return a new RDD by applying a function to each element of this RDD. >>> rdd = sc.parallelize(["b", "a", "c"])
>>> sorted(rdd.map(lambda x: (x, 1)).collect())
[('a', 1), ('b', 1), ('c', 1)]
"""
def func(_, iterator):
return map(fail_on_stopiteration(f), iterator)
return self.mapPartitionsWithIndex(func, preservesPartitioning)

map将每一条输入执行func操作并对应返回一个对象,形成一个新的rdd,如源码中的rdd.map(lambda x: (x, 1) -->  [('a', 1), ('b', 1), ('c', 1)]

flatMap会先执行map的操作,再将所有对象合并为一个对象,返回值是一个Sequence

flatMap源码:

def flatMap(self, f, preservesPartitioning=False):
"""
>>> rdd = sc.parallelize([2, 3, 4])
>>> sorted(rdd.flatMap(lambda x: range(1, x)).collect())
[1, 1, 1, 2, 2, 3]
>>> sorted(rdd.flatMap(lambda x: [(x, x), (x, x)]).collect())
[(2, 2), (2, 2), (3, 3), (3, 3), (4, 4), (4, 4)]
"""
def func(s, iterator):
return chain.from_iterable(map(fail_on_stopiteration(f), iterator))
return self.mapPartitionsWithIndex(func, preservesPartitioning)
注意:flatMap将输入执行func操作时,对象必须是可迭代的

 map与flatMap的区别:

 from pyspark import SparkConf, SparkContext

 conf = SparkConf()
sc = SparkContext(conf=conf) def func_map():
data = ["hello world", "hello fly"]
data_rdd = sc.parallelize(data)
map_rdd = data_rdd.map(lambda s: s.split(" "))
print("map print:{}".format(map_rdd.collect())) def func_flat_map():
data = ["hello world", "hello fly"]
data_rdd = sc.parallelize(data)
flat_rdd = data_rdd.flatMap(lambda s: s.split(" "))
print("flatMap print:{}".format(flat_rdd.collect())) func_map()
func_flat_map()
sc.stop()

执行结果:

map print:[['hello', 'world'], ['hello', 'fly']]
flatMap print:['hello', 'world', 'hello', 'fly']

可以看出,map对 "hello world", "hello fly"这两个对象分别映射为['hello', 'world'], ['hello', 'fly'],而flatMap在map的基础上做了一个合并操作,将这两个对象合并为一个['hello', 'world', 'hello', 'fly'],这就造就了flatMap在词频统计方面的优势。

Spark中map与flatMap的更多相关文章

  1. spark中map与flatMap的区别

    作为spark初学者对,一直对map与flatMap两个函数比较难以理解,这几天看了和写了不少例子,终于把它们搞清楚了 两者的区别主要在于action后得到的值 例子: import org.apac ...

  2. Spark入门(四)--Spark的map、flatMap、mapToPair

    spark的RDD操作 在上一节Spark经典的单词统计中,了解了几个RDD操作,包括flatMap,map,reduceByKey,以及后面简化的方案,countByValue.那么这一节将介绍更多 ...

  3. spark中map与mapPartitions区别

    在spark中,map与mapPartitions两个函数都是比较常用,这里使用代码来解释一下两者区别 import org.apache.spark.{SparkConf, SparkContext ...

  4. (转)scala中map与flatMap浅析

    在函数式语言中,函数作为一等公民,可以在任何地方定义,在函数内或函数外,可以作为函数的参数和返回值,可以对函数进行组合.由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好 ...

  5. 理解Swift中map 和 flatMap对集合的作用

    map和flatMap是函数式编程中常见的概念,python等语言中都有.借助于 map和flapMap 函数可以非常轻易地将数组转换成另外一个新数组. map函数可以被数组调用,它接受一个闭包作为參 ...

  6. spark之map与flatMap差别

    scala> val m = List(List("a","b"),List("c","d")) m: List[ ...

  7. java8中 map和flatmap的理解

    假如我们有这样一个需求给定单词列表["Hello","World"],你想要返回列表["H","e","l&q ...

  8. spark中map和mapPartitions算子的区别

    区别: 1.map是对rdd中每一个元素进行操作 2.mapPartitions是对rdd中每个partition的迭代器进行操作 mapPartitions优点: 1.若是普通map,比如一个par ...

  9. Spark算子--map和flatMap

    map和flatMap--Transformation类算子 代码示例 result  

随机推荐

  1. 玩转 lua in Redis

    一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功 ...

  2. Java_oracle超出打开游标的最大数的原因和解决方案

    第一步:核查Oracle数据库 的游标的最大数 处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded) ORA-01000_maximum_o ...

  3. 后RCNN时代的物体检测及实例分割进展

    https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650736740&idx=3&sn=cdce446703e69b ...

  4. 【转载】中文输入法下onKeyPress不能触发的问题

    onKeypress---->oninput https://segmentfault.com/a/1190000008820968

  5. spring boot 配置文件

    spring boot使用一个全局配置文件:主要是以下两种类型 application.properties  :例:server.port=9998 application.yml(YAML)  : ...

  6. Python基础之多态与多态性

    切记:不要将多态与多态性这二者混为一谈,只要分开,就会很明朗了. 一.多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承). 比如:动物分为人类.狗类.猪类(在定义角 ...

  7. python网络爬虫笔记(六)

    1.获取属性如果不存在就返回404,通过内置一系列函数,我们可以对任意python对象进行剖析,拿到其内部数据,但是要注意的是,只是在不知道对象信息的时候,我们可以获得对象的信息. 2.实例属性和类属 ...

  8. linux里面的命令:./和. /(这里有空格)的区别

    /  ( 直接/ ) 直接 / 表示: 根目录. ./ ( 点号紧跟/ ) 点号紧跟/ 表示: 当前目录(相对路径的写法). . / ( 点号 空格 / ) 有空格的点号等同于source命令,表示在 ...

  9. Android播放功能的实现

    Android播放语言功能的实现 需要用到的类文件TextToSpeech,此类可以实现播放语言的功能 支持播放的语言1.英语 2.法语 3.德语 4.意语 5.西班牙语 1.实例化此类,添加上下文对 ...

  10. HDU 1671 Phone List (qsort字符串排序与strncmp的使用 /字典树)

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...