1. 程式人生 > >Spark中的aggregate和aggregateByKey的區別及疑惑

Spark中的aggregate和aggregateByKey的區別及疑惑

aggregate(zeroValue,seq,comb,taskNums)

將初始值和第一個分割槽中的第一個元素傳遞給seq函式進行計算,然後將計算結果和第二個元素傳遞給seq函式,直到計算到最後一個值。第二個分割槽中也是同理操作。最後將初始值、所有分割槽的結果經過combine函式進行計算(先將前兩個結果進行計算,將返回結果和下一個結果傳給combine函式,以此類推),並返回最終結果。

>>> data = sc.parallelize((1,2,3,4,5,6),2)
>>> def seq(a,b):
...     print 'seqOp:'
+str(a)+"\t"+str(b) ... return min(a,b) ... >>> def combine(a,b): ... print 'comOp:'+str(a)+"\t"+str(b) ... return a+b ... >>> data.aggregate(3,seq,combine) seqOp:3 1 seqOp:1 2 seqOp:1 3 seqOp:3 4 seqOp:3 5 seqOp:3 6 comOp:3 1 comOp:4 3 7 >>>

從上面的程式碼的輸出結果可以看出,1,2,3被分到一個分割槽中,4,5,6被分到一個分割槽中。3先和第一個元素1傳給seq函式,返回最小值1,然後將1和第二個元素2傳給seq函式,返回1,以此類推,最後返回第一個分割槽中的最小值1。第二個分割槽一樣道理,最後結果返回最小值3.最後將初始值3和兩個分割槽的結果經過combine函式進行計算,先將初始值3和第一個分割槽的結果1傳給combine函式,返回4,然後將4和第二個分割槽結果3傳給combine函式,返回最終結果7。

aggregateByKey(zeroValue,seq,comb,taskNums)

在kv對的RDD中,,按key將value進行分組合並,合併時,將每個value和初始值作為seq函式的引數,進行計算,返回的結果作為一個新的kv對,然後再將結果按照key進行合併,最後將每個分組的value傳遞給combine函式進行計算(先將前兩個value進行計算,將返回結果和下一個value傳給combine函式,以此類推),將key與計算結果作為一個新的kv對輸出。

見程式碼:

>>> data = sc.parallelize([(1,3),(1,2),(1,4
),(2,3)]) >>> def seq(a,b): ... return max(a,b) ... >>> def combine(a,b): ... return a+b ... >>> data.aggregateByKey(3,seq,comb,4).collect() [(1, 10), (2, 3)]

但是,在使用時遇到了問題,困惑:

在啟動pyspark時,如果是./bin/pyspark –master local[3]或3以上的數字或*都會返回預期的結果。
如果數字小魚等於2,結果就會有出入。如[(1,7)(2,3)]。
不知道什麼原因,網上有人說:懷疑對於data的計算預設使用平行計算,而我們設定lcoal時沒有指定所用的cores數目,導致平行計算無法執行,只能保持某個計算結果,最終導致計算結果的錯誤。。。

相關推薦

djangoSTATIC_ROOTSTATICFILES_DIRS區別 MEDIA_ROOT

staticfiles:這是一個靜態資源管理的app,django.contrib.staticfiles。老的版本中,靜態資源管理一直是一個問題,部分app釋出的時候需要帶上靜態資源,在部署的時候必須

SparkaggregateaggregateByKey區別疑惑

aggregate(zeroValue,seq,comb,taskNums) 將初始值和第一個分割槽中的第一個元素傳遞給seq函式進行計算,然後將計算結果和第二個元素傳遞給seq函式,直到計算到最後一個值。第二個分割槽中也是同理操作。最後將初始值、所有分割槽的

SparkrepartitionpartitionBy的區別

是我 item its alt ive 同時 tint nts exe repartition 和 partitionBy 都是對數據進行重新分區,默認都是使用 HashPartitioner,區別在於partitionBy 只能用於 PairRDD,但是當它們同時都用於

js!!!的區別用法簡介

js中!的用法是比較靈活的,它除了做邏輯運算常常會用!做型別判斷,可以用!與上物件來求得一個布林值, 1、!可將變數轉換成boolean型別,null、undefined和空字串取反都為false,其餘都為true。 複製程式碼 1 !null=true 2 3

SparkmapflatMap的區別

Map和flatMap的區別 Transformation 含義 map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函式轉換後組成 flatMap(func) 類似於map,但是每一個輸入元素可以被對映為0或多個輸出

sparkmakerddparallelize的區別

我們知道,在Spark中建立RDD的建立方式大概可以分為三種:(1)、從集合中建立RDD;(2)、從外部儲存建立RDD;(3)、從其他RDD建立。   而從集合中建立RDD,Spark主要提供了兩中函式:parallelize和makeRDD。我們可以先看看這兩個函式的宣告

關於htmlsrchref使用區別

例子: <link href="" rel="stylesheet"> <script src="script.js"></script> <img src="image.jpg" alt="圖片無法顯示提示資訊"> href是Hy

【Big Data 每日一題20180821】Sparkmlmllib的區別

Spark中ml和mllib的主要區別和聯絡如下: ml和mllib都是Spark中的機器學習庫,目前常用的機器學習功能2個庫都能滿足需求。 spark官方推薦使用ml, 因為ml功能更全面更靈活,未來會主要支援ml,mllib很有可能會被廢棄(據說可能是在spark3.

每次進步一點點——sparkcachepersist的區別

昨天面試被問到了cache和persist區別,當時只記得是其中一個呼叫了另一個,但沒有回答出二者的不同,所以回來後重新看了原始碼,算是弄清楚它們的區別了。 cache和persist都是用於將一個RDD進行快取的,這樣在之後使用的過程中就不需要重新計算了,可

sparkmapflatmap之間的區別

map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。 flatmap()是將函式應用於RDD中的每個元素,將返回的迭代器的所有內容構成新的RDD,這樣就得到了一個由各列表中的元素組成的RDD,而不是一個列表組成的RDD。 有些拗口,看看例子就明白了。 val

Spark學習筆記 --- SparkMapFlatMap轉換的區別

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

mybatis #{} ${} 的區別應用場景

一、#{} 和 ${} 詳解 動態 sql 是 mybatis 的主要特性之一,在 mapper 中定義的引數傳到 xml 中之後,在查詢之前 mybatis 會對其進行動態解析。mybatis 為我們提供了兩種支援動態 sql 的語法:#{} 以及 ${}

spark map flatmap 的區別

需求背景: 統計相鄰兩個單詞出現的次數。 val s="A;B;C;D;B;D;C;B;D;A;E;D;C;A;B" s: String = A;B;C;D;B;D;C;B;D;A;E;D;C;A;B  val data=sc.parallelize(Seq(s)

SQLJOINUNION區別、用法示例

1.JOIN和UNION區別join 是兩張表做交連后里麵條件相同的部分記錄產生一個記錄集,union是產生的兩個記錄集(欄位要一樣的)並在一起,成為一個新的記錄集 。JOIN用於按照ON條件聯接兩個表,主要有四種:INNER JOIN:內部聯接兩個表中的記錄,僅當至少有一個同屬於兩表的行符合聯接條件時,內

mysqlinnodbmyisam對比索引原理區別

InnoDB和MyISAM是很多人在使用MySQL時最常用的兩個表型別,這兩個表型別各有優劣,5.7之後就不一樣了1、事務和外來鍵InnoDB具有事務,支援4個事務隔離級別,回滾,崩潰修復能力和多版本併發的事務安全,包括ACID。如果應用中需要執行大量的INSERT或UPDA

mybatis的#$的區別

背景 插入 trac sql註入 -m .com article 參數 -s 1. #將傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號。如:order by #user_id#,如果傳入的值是111,那麽解析成sql時的值為order by "111", 如果傳

hibernatehql語句listiterate區別

每次 hibernate 寫入 所有 讀取 條件 iter 查詢 hql 1.使用list()方法獲取查詢結果,每次發出一條語句,獲取全部數據。2.使用iterate()方法獲取查詢結果,先發出一條SQL語句用來查詢滿足條件數據的id,然後依次按照這些id查詢記錄,也就是要

javaArrayListLinkedList區別

插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:

mysqlreplicate_wild_do_tablereplicate_do_db區別

lan rep cati mil 多人 pan think lte 避免 使用replicate_do_db和replicate_ignore_db時有一個隱患,跨庫更新時會出錯。 如在Master(主)服務器上設置 replicate_do_db=test(my.conf

linux ll ls 區別

彩色 顯示文件 時間排序 linux 常用 所有 數字 名稱 sub ll 列出來的結果詳細,有時間,是否可讀寫等信息 ,象windows裏的 詳細信息ls 只列出文件名或目錄名 就象windows裏的 列表ll -t 是降序, ll -t | tac 是升序 ll不是