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數目,導致平行計算無法執行,只能保持某個計算結果,最終導致計算結果的錯誤。。。
相關推薦
django中STATIC_ROOT和STATICFILES_DIRS區別 及MEDIA_ROOT
staticfiles:這是一個靜態資源管理的app,django.contrib.staticfiles。老的版本中,靜態資源管理一直是一個問題,部分app釋出的時候需要帶上靜態資源,在部署的時候必須
Spark中的aggregate和aggregateByKey的區別及疑惑
aggregate(zeroValue,seq,comb,taskNums) 將初始值和第一個分割槽中的第一個元素傳遞給seq函式進行計算,然後將計算結果和第二個元素傳遞給seq函式,直到計算到最後一個值。第二個分割槽中也是同理操作。最後將初始值、所有分割槽的
Spark中repartition和partitionBy的區別
是我 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
Spark中map和flatMap的區別
Map和flatMap的區別 Transformation 含義 map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函式轉換後組成 flatMap(func) 類似於map,但是每一個輸入元素可以被對映為0或多個輸出
spark中makerdd和parallelize的區別
我們知道,在Spark中建立RDD的建立方式大概可以分為三種:(1)、從集合中建立RDD;(2)、從外部儲存建立RDD;(3)、從其他RDD建立。 而從集合中建立RDD,Spark主要提供了兩中函式:parallelize和makeRDD。我們可以先看看這兩個函式的宣告
關於html中src和href使用及區別
例子: <link href="" rel="stylesheet"> <script src="script.js"></script> <img src="image.jpg" alt="圖片無法顯示提示資訊"> href是Hy
【Big Data 每日一題20180821】Spark中ml和mllib的區別
Spark中ml和mllib的主要區別和聯絡如下: ml和mllib都是Spark中的機器學習庫,目前常用的機器學習功能2個庫都能滿足需求。 spark官方推薦使用ml, 因為ml功能更全面更靈活,未來會主要支援ml,mllib很有可能會被廢棄(據說可能是在spark3.
每次進步一點點——spark中cache和persist的區別
昨天面試被問到了cache和persist區別,當時只記得是其中一個呼叫了另一個,但沒有回答出二者的不同,所以回來後重新看了原始碼,算是弄清楚它們的區別了。 cache和persist都是用於將一個RDD進行快取的,這樣在之後使用的過程中就不需要重新計算了,可
spark中map和flatmap之間的區別
map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。 flatmap()是將函式應用於RDD中的每個元素,將返回的迭代器的所有內容構成新的RDD,這樣就得到了一個由各列表中的元素組成的RDD,而不是一個列表組成的RDD。 有些拗口,看看例子就明白了。 val
Spark學習筆記 --- Spark中Map和FlatMap轉換的區別
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)
SQL中JOIN和UNION區別、用法及示例
1.JOIN和UNION區別join 是兩張表做交連后里麵條件相同的部分記錄產生一個記錄集,union是產生的兩個記錄集(欄位要一樣的)並在一起,成為一個新的記錄集 。JOIN用於按照ON條件聯接兩個表,主要有四種:INNER JOIN:內部聯接兩個表中的記錄,僅當至少有一個同屬於兩表的行符合聯接條件時,內
mysql中innodb和myisam對比及索引原理區別
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", 如果傳
hibernate中hql語句中list和iterate區別
每次 hibernate 寫入 所有 讀取 條件 iter 查詢 hql 1.使用list()方法獲取查詢結果,每次發出一條語句,獲取全部數據。2.使用iterate()方法獲取查詢結果,先發出一條SQL語句用來查詢滿足條件數據的id,然後依次按照這些id查詢記錄,也就是要
java中ArrayList和LinkedList區別
插入 list 新的 查找 arr tro 基於 列表 時間復雜度 ArrayList和LinkedList最主要的區別是基於不同數據結構 ArrayList是基於動態數組的數據結構,LinkedList基於鏈表的數據結構,針對這點,從時間復雜度和空間復雜度來看主要區別:
mysql中replicate_wild_do_table和replicate_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不是