您好,登錄后才能下訂單哦!
本篇內容主要講解“spark中flatmap跟map的區別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“spark中flatmap跟map的區別”吧!
背景
map和flatmap扁平化調用,從字面意思或者官網介紹,可能會給一些人在理解上造成困擾【包括本人】,所以今天專門花時間來分析,現整理如下:
首先做一下名詞解釋------------------------------------------------
我的理解
map:map方法返回的是一個object,map將流中的當前元素替換為此返回值;
flatMap:flatMap方法返回的是一個stream,flatMap將流中的當前元素替換為此返回流拆解的流元素,底層是遞歸性質的只要數據是集合就會把該集合全部數據拿出來;
官方解釋
map:Returns a stream consisting of the results of applying the given function to the elements of this stream.
返回一個流,包含給定函數應用在流中每一個元素后的結果
flatmap:Returns a stream consisting of the results of replacing each element of this stream with the contents of a mapped stream produced by applying the provided mapping function to each element.
返回一個流,包含將此流中的每個元素替換為通過給定函數映射應用于每個元素而生成的映射流的內容
舉例說明
有二箱雞蛋,每箱5個,現在要把雞蛋加工成煎蛋,然后分給學生。
map做的事情:把二箱雞蛋分別加工成煎蛋,還是放成原來的兩箱,分給2組學生;
flatMap做的事情:把二箱雞蛋分別加工成煎蛋,然后放到一起【10個煎蛋】,分給10個學生;
完整測試代碼如下:
public class Map_FlatMap { List<String[]> eggs = new ArrayList<>(); @Before public void init() { // 第一箱雞蛋 eggs.add(new String[]{"雞蛋_1", "雞蛋_1", "雞蛋_1", "雞蛋_1", "雞蛋_1"}); // 第二箱雞蛋 eggs.add(new String[]{"雞蛋_2", "雞蛋_2", "雞蛋_2", "雞蛋_2", "雞蛋_2"}); } // 自增生成組編號 static int group = 1; // 自增生成學生編號 static int student = 1; /** * 把二箱雞蛋分別加工成煎蛋,還是放在原來的兩箱,分給2組學生 */ @Test public void map() { eggs.stream() .map(x -> Arrays.stream(x).map(y -> y.replace("雞", "煎"))) .forEach(x -> System.out.println("組" + group++ + ":" + Arrays.toString(x.toArray()))); /* 控制臺打印:------------ 組1:[煎蛋_1, 煎蛋_1, 煎蛋_1, 煎蛋_1, 煎蛋_1] 組2:[煎蛋_2, 煎蛋_2, 煎蛋_2, 煎蛋_2, 煎蛋_2] */ } /** * 把二箱雞蛋分別加工成煎蛋,然后放到一起【10個煎蛋】,分給10個學生 */ @Test public void flatMap() { eggs.stream() .flatMap(x -> Arrays.stream(x).map(y -> y.replace("雞", "煎"))) .forEach(x -> System.out.println("學生" + student++ + ":" + x)); /* 控制臺打印:------------ 學生1:煎蛋_1 學生2:煎蛋_1 學生3:煎蛋_1 學生4:煎蛋_1 學生5:煎蛋_1 學生6:煎蛋_2 學生7:煎蛋_2 學生8:煎蛋_2 學生9:煎蛋_2 學生10:煎蛋_2 */ } }
落實到Python中區別就是
flatMap
val lineArray = Array("hello you","hello me","hello world") val lines = sc.parallelize(lineArray, 1) val words = lines.flatMap(line =>{ line.split(" ") }) words.foreach { word => println(word.mkString) }
結果:
map
val lineArray = Array("hello you","hello me","hello world") val lines = sc.parallelize(lineArray, 1) val words = lines.map(line =>{ line.split(" ") }) words.foreach { word => println(word.mkString) }
結果
map:獲取一個新元素(原本幾個元素還是幾個元素)
flatmap: 獲取一個或者多個新元素(比原來的元素多)
到此,相信大家對“spark中flatmap跟map的區別”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。