reduceByKey和groupByKey區別與用法

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

在Spar看中,我們知道一切的操作都是基于RDD的。在使用中,RDD有一種非常特殊也是非常實用的format——pair RDD,即RDD的每一行是(key, value)的格式。這種格式很像Python的字典類型,便于針對key進行一些處理。

針對pair RDD這樣的特殊形式,spark中定義了許多方便的操作,今天主要介紹一下reduceByKey和groupByKey,因為在接下來講解《在spark中如何實現SQL中的group_concat功能?》時會用到這兩個operations。

首先,看一看spark官網[1]是怎么解釋的:

reduceByKey(func,?numPartitions=None)

Merge the values for each key using an associative reduce function. This will also perform the merging?locally on each mapper?before sending results to a reducer, similarly to a “combiner” in MapReduce. Output will be hash-partitioned with?numPartitions?partitions, or the default parallelism level if?numPartitions?is not specified.

也就是,reduceByKey用于對每個key對應的多個value進行merge操作,最重要的是它能夠在本地先進行merge操作,并且merge操作可以通過函數自定義。

groupByKey(numPartitions=None)

Group the values for each key in the RDD into a single sequence. Hash-partitions the resulting RDD with numPartitions partitions.?Note: If you are grouping in order to perform an aggregation (such as a sum or average) over each key, using?reduceByKey?or aggregateByKey will provide much better performance.

也就是,groupByKey也是對每個key進行操作,但只生成一個sequence。需要特別注意“Note”中的話,它告訴我們:如果需要對sequence進行aggregation操作(注意,groupByKey本身不能自定義操作函數),那么,選擇reduceByKey/aggregateByKey更好。這是因為groupByKey不能自定義函數,我們需要先用groupByKey生成RDD,然后才能對此RDD通過map進行自定義函數操作。

為了更好的理解上面這段話,下面我們使用兩種不同的方式去計算單詞的個數[2]:

val words = Array("one", "two", "two", "three", "three", "three")  
val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))  
val wordCountsWithReduce = wordPairsRDD.reduceByKey(_ + _)  
val wordCountsWithGroup = wordPairsRDD.groupByKey().map(t => (t._1, t._2.sum))  

上面得到的wordCountsWithReduce和wordCountsWithGroup是完全一樣的,但是,它們的內部運算過程是不同的。

(1)當采用reduceByKeyt時,Spark可以在每個分區移動數據之前將待輸出數據與一個共用的key結合。借助下圖可以理解在reduceByKey里究竟發生了什么。 注意在數據對被搬移前同一機器上同樣的key是怎樣被組合的(reduceByKey中的lamdba函數)。然后lamdba函數在每個區上被再次調用來將所有值reduce成一個最終結果。整個過程如下:

(2)當采用groupByKey時,由于它不接收函數,spark只能先將所有的鍵值對(key-value pair)都移動,這樣的后果是集群節點之間的開銷很大,導致傳輸延時。整個過程如下:

因此,在對大數據進行復雜計算時,reduceByKey優于groupByKey。

另外,如果僅僅是group處理,那么以下函數應該優先于 groupByKey?:
  (1)、combineByKey?組合數據,但是組合之后的數據類型與輸入時值的類型不一樣。
  (2)、foldByKey合并每一個 key 的所有值,在級聯函數和“零值”中使用。

最后,對reduceByKey中的func做一些介紹:

如果是用python寫的spark,那么有一個庫非常實用:operator[3],其中可以用的函數包括:大小比較函數,邏輯操作函數,數學運算函數,序列操作函數等等。這些函數可以直接通過“from operator import *”進行調用,直接把函數名作為參數傳遞給reduceByKey即可。如下:

<span style="font-size:14px;">from operator import add  
rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 1)])  
sorted(rdd.reduceByKey(add).collect())  [('a', 2), ('b', 1)]</span>  

?

轉載于:https://my.oschina.net/u/2935389/blog/1359396

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281345.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python自動化測試-D6-學習筆記之一(常用模塊補充datetime模塊)

# datetime 模塊import datetimeprint(datetime.datetime.today()) #當前日期&#xff0c;到秒 打印結果&#xff1a;2018-01-21 10:23:46.034410print(datetime.datetime.now()) # 當前日期&#xff0c;到秒 打印結果&#xff1a;2018-01-21 10:23:46.034410print(datetime.d…

Vue如何在data中正確引入圖片路徑

方法一&#xff1a;將圖片資源放入項目 /static 目錄下&#xff0c;使用絕對或相對路徑引用即可 // 文件結構 |-- src | |-- components | | |-- banner.vue |-- static | |-- images | | |-- pic.jpg<template><div id"banner"><img :s…

軟件工程的第一性原理丨SmartIDE

作者&#xff1a;徐磊原文地址&#xff1a;https://smartide.cn/zh/blog/2022-1022-software-engineering/徐磊英捷創軟科技&#xff08;北京&#xff09;有限公司創始?/?席架構師 / CEO / SmartIDE開源項?創始?。微軟最有價值專家MVP&#xff0c;微軟區域技術總監&#xf…

排序算法之快速排序詳解

一、算法介紹 快速排序&#xff1a;快速排序的基本思想是通過一次排序將等待的記錄分成兩個獨立的部分&#xff0c;其中一部分記錄的關鍵字小于另一部分的關鍵字。C部分的快速排序一直持續到整個序列被排序。 任取一個元素 (如第一個) 為中心提出所有小于它的元素&#xff0c;并…

openstack 中國聯盟公開課參會總結

主流趨勢 1. openstack defcore 互操作性認證。打通不同的openstack 廠商之間的連接2. 首批OpenStack管理員認證(COA)將于2016年進行3. 混合云應用廣泛 Cloud Broker,cascading openstack 云連接器4. DevOps5. 虛擬桌面6. Storage 方面&#xff0c;Ceph和Glusterfs 7. Network…

bzoj1088[SCOI2005]掃雷Mine

1088: [SCOI2005]掃雷Mine Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4284 Solved: 2552[Submit][Status][Discuss]Description 相信大家都玩過掃雷的游戲。那是在一個n*m的矩陣里面有一些雷&#xff0c;要你根據一些信息找出雷來。萬圣節到了&#xff0c;“余”人國流…

Re:從零開始的Vue項目搭建

Re&#xff1a;從零開始的Vue項目搭建初始的終結與結束的開始Nodejs項目的簡單測試從零開始webpack開發模式webpack編譯打包后記初始的終結與結束的開始 最開始接觸vue項目搭建是從vue-cli開始&#xff0c;模板式操作&#xff0c;一鍵搞定&#xff0c;幾乎可以無縫進入代碼開發…

在數據庫插入帶小數點數據的問題

想在mysql插入以下數據設計表的時候沒有注意,之前都用的int,這次換成了double,但是插入第一條3.50的時候數據庫顯示為:查了之后知道是設計表的時候沒有注意小數點的設置轉載于:https://juejin.im/post/5c0f61bb6fb9a049ea38cbe9

oracle 11g 創建 job 20

15-10-19 23:48:04分類&#xff1a; Oracle--創建一次執行的匿名塊任務&#xff0c;成功調用一次后job消失BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name > my_new_job2, job_type > PLSQL_BLOCK, job_action &g…

Jzoj5317 Func

f(1)1 f(2x)f(x) f(2x1)f(x)f(x1) 給出n<10^6&#xff0c;求:所有的i滿足f(i)n 第一道類歐算法 我們考慮一個性質 f(2x1)f(x)f(x1)f(2x)f(2x2) 所以&#xff0c;顯然有f(2x1)>f(2x) f(2x1)>f(2x2) 那么現在我們知道了f(2x1),自然考慮枚舉一個f(2x) 可以按照以下形式…

C# WPF 用代碼畫一幅圖(*精品*)

概述有時候我們的程序界面中需要顯示一些簡單的示意圖&#xff0c;一般我們有原圖的話直接嵌入我們程序就可以&#xff0c;但有時候我們沒有原圖&#xff0c;這時候我們不妨用代碼自己畫出來.今天小編要給大家展示的是這樣一副圖片&#xff1a;接下來&#xff0c;我就用代碼純手…

礦難讓顯卡壓了那么多貨咋辦?NV如是說

2019獨角獸企業重金招聘Python工程師標準>>> 在蘇州 GTC 開幕的幾天前&#xff0c;英偉達剛剛遭遇了一次股價的腰斬。 近來加密貨幣的熱度漸低&#xff0c;受到挖礦熱潮照顧許多的英偉達「礦機」銷量受到打擊&#xff0c;甚至出現了嚴重的庫存危機&#xff0c;加上近…

花式看超級碗 人工智能、大數據在碗里

“超級碗”可不是一個大碗!!!超級碗(Super Bowl)是美國國家美式足球聯盟(也稱為國家橄欖球聯盟)的年度冠軍賽&#xff0c;勝者被稱為“世界冠軍”。超級碗一般在每年1月最后一個或2月第一個星期天舉行&#xff0c;那一天稱為超級碗星期天(Super Bowl Sunday)。超級碗是比賽的名…

Git分支操作與遠程倉庫的使用

Git分支操作本地倉庫創建分支合并分支刪除分支遠程倉庫push 推送遠程分支pull 拉取遠程分支fetch 更新遠程分支本地分支與遠程分支的跟蹤關系本地倉庫 由于Git的分布式特性&#xff0c;所以沒有絕對的本地和遠程概念&#xff0c;一切都是相對的。對于分支的操作&#xff0c;個…

SimMechanics/Second Generation倒立擺模型建立及初步仿真學習

筆者最近搗鼓Simulink&#xff0c;發現MATLAB的仿真模塊真的十分強大&#xff0c;以前只是在命令窗口敲點代碼&#xff0c;直到不小心敲入simulink&#xff0c;就一發不可收拾。話說simulink的模塊化建模確實方便&#xff0c;只要拖拽框框然后雙擊設置屬性就可以慢慢堆建自己的…

10 行代碼提取復雜 Excel 數據

把 Excel 文件導入關系數據庫是數據分析業務中經常要做的事情&#xff0c;但許多 Excel 文件的格式并不規整&#xff0c;需要事先將其中的數據結構化后再用 SQL 語句寫入數據庫。而一般情況下&#xff0c;結構化的工作量會比較大&#xff0c;而且很難通用&#xff0c;每次都要針…

將一個數組拆分為若干個相等數組

var a [法國,澳大利亞,智利,新西蘭,西班牙,加拿大,阿根廷,美國,0,國產,波多黎各,英國,比利時,德國,意大利,意大利]; var b []; var result []; var k 0; for(var i 0; i<a.length; i){ if(i%3 0){ b []; for(var j 0; j<3; j){ if(a[ij] undefined){ continue; …

人工智能模型的網絡結構可視化

本文主要介紹人工智能模型的網絡結構可視化的常見方法。對于使用神經網絡模型來說&#xff0c;我們主要關注的是模型的輸入和輸出。在 ML.NET 中使用 ONNX 模型時&#xff0c;我們就需要了解這些信息&#xff0c;以便在構成神經網絡的所有層之間生成連接映射。下圖就是昨天 《Y…

Git 撤銷操作 / 回滾歷史

撤銷操作 git checkout -- <filename>&#xff0c;放棄文件的當前更改&#xff0c;回到最近一次的提交狀態git reset HEAD <filename>&#xff0c;取消暫存文件git commit --amend&#xff0c;覆蓋上一次的提交&#xff0c;雖然不是撤銷操作&#xff0c;但有類似的…

整理ASP.NET MVC 5各種錯誤請求[401,403,404,500]的攔截及自定義頁面處理實例

http://2sharings.com/2015/asp-net-mvc-5-custom-404-500-error-hanlde https://blog.csdn.net/yhyhyhy/article/details/51003683 ASP.NET MVC 5的開發中&#xff0c;服務器的各種錯誤[如&#xff1a;401&#xff08;登錄授權驗證&#xff09;&#xff0c;403&#xff08;禁止…