• spark RDD 的map与flatmap区别说明


    HDFS到HDFS过程

    看看map 和flatmap的位置

    Flatmap 和map 的定义

    map()是将函数用于RDD中的每个元素,将返回值构成新的RDD。

    flatmap()是将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD

    例子:

    val rdd = sc.parallelize(List("coffee panda","happy panda","happiest panda party"))

    输入

    rdd.map(x=>x).collect

    结果

    res9: Array[String] = Array(coffee panda, happy panda, happiest panda party)

    输入

    rdd.flatMap(x=>x.split(" ")).collect

    结果

    res8: Array[String] = Array(coffee, panda, happy, panda, happiest, panda, party)

    flatMap说明白就是先map然后再flat,再来看个例子

    val rdd1 = sc.parallelize(List(1,2,3,3))

    scala> rdd1.map(x=>x+1).collect

    res10: Array[Int] = Array(2, 3, 4, 4)

    scala> rdd1.flatMap(x=>x.to(3)).collect

    res11: Array[Int] = Array(1, 2, 3, 2, 3, 3, 3)


    map(func)

    将原数据的每个元素传给函数func进行格式化,返回一个新的分布式数据集。(原文:Return a new distributed dataset formed by passing each element of the source through a function func.)


    flatMap(func)

    跟map(func)类似,但是每个输入项和成为0个或多个输出项(所以func函数应该返回的是一个序列化的数据而不是单个数据项)。(原文:Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item).)

    Flatmap 和map 使用说明

    在使用时map会将一个长度为N的RDD转换为另一个长度为N的RDD;而flatMap会将一个长度为N的RDD转换成一个N个元素的集合,然后再把这N个元素合成到一个单个RDD的结果集。

    比如一个包含三行内容的数据文件“README.md”。

    在spark中map函数和flatMap函数是两个比较常用的函数。其中
    map:对集合中每个元素进行操作。
    flatMap:对集合中每个元素进行操作然后再扁平化。

    例如:

    val arr=sc.parallelize(Array(("A",1),("B",2),("C",3))) arr.flatmap(x=>(x._1+x._2)).foreach(println)

    输出结果为

    A1

    B2

    C3

    如果用map

    val arr=sc.parallelize(Array(("A",1),("B",2),("C",3)))

    arr.map(x=>(x._1+x._2)).foreach(println)

    输出结果

    A1

    B2

    C3

    所以flatMap扁平化意思大概就是先用了一次map之后对全部数据再一次map。


    Flatmap 和map 实际使用场景

    有一个场景,在字符串中如何统计相邻字符对出现的次数。意思就是如果有A;B;C;D;B;C字符串,则(A,B),(C,D),(D,B)相邻字符对出现一次,(B,C)出现两次。
    如有数据

    A;B;C;D;B;D;C

    B;D;A;E;D;C

    A;B

    统计相邻字符对出现次数代码如下

    data.map(_.split(";")).flatMap(x=>{

    for(i<-0 until x.length-1) yield (x(i)+","+x(i+1),1)

    }).reduceByKey(_+_).foreach(println)

    输出结果为

    (A,E,1)(E,D,1)(D,A,1)(C,D,1)(B,C,1)(B,D,2)(D,C,2)(D,B,1)(A,B,2)

    map操作我记得的有map(一条对一条),mapToPair(map成键值对),flatMap(一条记录变n条(n>=0))


    Flatmap 和map 区别

    map(func)函数会对每一条输入进行指定的func操作,然后为每一条输入返回一个对象;而flatMap(func)也会对每一条输入进行执行的func操作,然后每一条输入返回一个相对,但是最后会将所有的对象再合成为一个对象;从返回的结果的数量上来讲,map返回的数据对象的个数和原来的输入数据是相同的,而flatMap返回的个数则是不同的。

     

    map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象;而flatMap函数则是两个操作的集合——正是“先映射后扁平化”:

    操作1:同map函数一样:对每一条输入进行指定的操作,然后为每一条输入返回一个对象

    操作2:最后将所有对象合并为一个对象

    通过上图可以看出,flatMap其实比map多的就是flatten操作。
    ————————————————
    原文链接:https://blog.csdn.net/WYpersist/article/details/80220211

    当你的才华还撑不起你的野心时,就应该静下心来学习! Think big!Look forward!
  • 相关阅读:
    Pytest单元测试框架——Pytest+Allure+Jenkins的应用
    Postman+Newman+Git+Jenkins接口自动化测试
    Pytest单元测试框架——Pytest简介
    unittest单元测试框架
    Postman学习笔记(二)
    CukeTest+Puppeteer的Web自动化测试(二)
    Postman学习笔记(一)
    CukeTest+Puppeteer的Web自动化测试(一)
    Puppeteer笔记(八):Puppeteer执行自定义Javascript方法
    Puppeteer笔记(七):Puppeteer切换浏览器TAB页
  • 原文地址:https://www.cnblogs.com/iber/p/12984632.html
Copyright © 2020-2023  润新知