欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spark操作之a(chǎn)ggregate、aggregateByKey詳解

 更新時間:2019年06月17日 10:43:47   作者:午夜陽光psb  
這篇文章主要介紹了Spark操作之a(chǎn)ggregate、aggregateByKey詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1. aggregate函數(shù)

將每個分區(qū)里面的元素進行聚合,然后用combine函數(shù)將每個分區(qū)的結(jié)果和初始值(zeroValue)進行combine操作。這個函數(shù)最終返回的類型不需要和RDD中元素類型一致。

seqOp操作會聚合各分區(qū)中的元素,然后combOp操作把所有分區(qū)的聚合結(jié)果再次聚合,兩個操作的初始值都是zeroValue.   seqOp的操作是遍歷分區(qū)中的所有元素(T),第一個T跟zeroValue做操作,結(jié)果再作為與第二個T做操作的zeroValue,直到遍歷完整個分區(qū)。combOp操作是把各分區(qū)聚合的結(jié)果,再聚合。aggregate函數(shù)返回一個跟RDD不同類型的值。因此,需要一個操作seqOp來把分區(qū)中的元素T合并成一個U,另外一個操作combOp把所有U聚合。

例子程序:

scala> val rdd = List(1,2,3,4,5,6,7,8,9)
rdd: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> rdd.par.aggregate((0,0))(
(acc,number) => (acc._1 + number, acc._2 + 1),
(par1,par2) => (par1._1 + par2._1, par1._2 + par2._2)
)
res0: (Int, Int) = (45,9)

scala> res0._1 / res0._2
res1: Int = 5

過程大概這樣:

首先,初始值是(0,0),這個值在后面2步會用到。
然后,(acc,number) => (acc._1 + number, acc._2 + 1),number即是函數(shù)定義中的T,這里即是List中的元素。所以acc._1 + number,acc._2 + 1的過程如下。

1.  0+1,  0+1
2.  1+2,  1+1
3.  3+3,  2+1
4.  6+4,  3+1
5.  10+5,  4+1
6.  15+6,  5+1
7.  21+7,  6+1
8.  28+8,  7+1
9.  36+9,  8+1

結(jié)果即是(45,9)。這里演示的是單線程計算過程,實際Spark執(zhí)行中是分布式計算,可能會把List分成多個分區(qū),假如3個,p1(1,2,3,4),p2(5,6,7,8),p3(9),經(jīng)過計算各分區(qū)的的結(jié)果(10,4),(26,4),(9,1),這樣,執(zhí)行(par1,par2) =>(par1._1 + par2._1, par1._2 + par2._2)就是(10+26+9,4+4+1)即(45,9),再求平均值就簡單了。

2. aggregateByKey函數(shù):

對PairRDD中相同的Key值進行聚合操作,在聚合過程中同樣使用了一個中立的初始值。和aggregate函數(shù)類似,aggregateByKey返回值的類型不需要和RDD中value的類型一致。因為aggregateByKey是對相同Key中的值進行聚合操作,所以aggregateByKey'函數(shù)最終返回的類型還是PairRDD,對應(yīng)的結(jié)果是Key和聚合后的值,而aggregate函數(shù)直接返回的是非RDD的結(jié)果。

例子程序:

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext

object AggregateByKeyOp {
 def main(args:Array[String]){
   val sparkConf: SparkConf = new SparkConf().setAppName("AggregateByKey").setMaster("local")
  val sc: SparkContext = new SparkContext(sparkConf)
   
   val data=List((1,3),(1,2),(1,4),(2,3))
   val rdd=sc.parallelize(data, 2)
   
   //合并不同partition中的值,a,b得數(shù)據(jù)類型為zeroValue的數(shù)據(jù)類型
   def combOp(a:String,b:String):String={
    println("combOp: "+a+"\t"+b)
    a+b
   }
   //合并在同一個partition中的值,a的數(shù)據(jù)類型為zeroValue的數(shù)據(jù)類型,b的數(shù)據(jù)類型為原value的數(shù)據(jù)類型
   def seqOp(a:String,b:Int):String={
    println("SeqOp:"+a+"\t"+b)
    a+b
   }
   rdd.foreach(println)
   //zeroValue:中立值,定義返回value的類型,并參與運算
   //seqOp:用來在同一個partition中合并值
   //combOp:用來在不同partiton中合并值
   val aggregateByKeyRDD=rdd.aggregateByKey("100")(seqOp, combOp)
   sc.stop()
 }
}

運行結(jié)果:

將數(shù)據(jù)拆分成兩個分區(qū)

//分區(qū)一數(shù)據(jù)
(1,3)
(1,2)
//分區(qū)二數(shù)據(jù)
(1,4)
(2,3)

//分區(qū)一相同key的數(shù)據(jù)進行合并
seq: 100     3   //(1,3)開始和中立值進行合并  合并結(jié)果為 1003
seq: 1003     2   //(1,2)再次合并 結(jié)果為 10032

//分區(qū)二相同key的數(shù)據(jù)進行合并
seq: 100     4  //(1,4) 開始和中立值進行合并 1004
seq: 100     3  //(2,3) 開始和中立值進行合并 1003

將兩個分區(qū)的結(jié)果進行合并
//key為2的,只在一個分區(qū)存在,不需要合并 (2,1003)
(2,1003)

//key為1的, 在兩個分區(qū)存在,并且數(shù)據(jù)類型一致,合并
comb: 10032     1004
(1,100321004)

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot實現(xiàn)日志鏈路追蹤的項目實踐

    SpringBoot實現(xiàn)日志鏈路追蹤的項目實踐

    在分布式系統(tǒng)中,由于請求的處理過程可能會跨越多個服務(wù),因此,對請求的追蹤變得尤為重要,本文主要介紹了SpringBoot實現(xiàn)日志鏈路追蹤的項目實踐,感興趣的可以了解一下
    2024-03-03
  • Java實現(xiàn)Floyd算法的示例代碼

    Java實現(xiàn)Floyd算法的示例代碼

    Floyd算法又稱為插點法,是一種利用動態(tài)規(guī)劃的思想尋找給定的加權(quán)圖中多源點之間最短路徑的算法。本文將用Java語言實現(xiàn)Floyd算法,需要的可以參考一下
    2022-07-07
  • Java實現(xiàn)深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)算法

    Java實現(xiàn)深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)算法

    深度優(yōu)先搜索(DFS)和廣度優(yōu)先搜索(BFS)是兩種基本的圖搜索算法,可用于圖的遍歷、路徑搜索等問題。DFS采用棧結(jié)構(gòu)實現(xiàn),從起點開始往深處遍歷,直到找到目標節(jié)點或遍歷完整個圖;BFS采用隊列結(jié)構(gòu)實現(xiàn),從起點開始往廣處遍歷,直到找到目標節(jié)點或遍歷完整個圖
    2023-04-04
  • 基于從request獲取各種路徑的方法介紹

    基于從request獲取各種路徑的方法介紹

    下面小編就為大家分享一篇基于從request獲取各種路徑的方法介紹,具有很好的參考價值,希望對大家有所幫助
    2017-11-11
  • java基礎(chǔ)理論Stream管道流Map操作示例

    java基礎(chǔ)理論Stream管道流Map操作示例

    這篇文章主要未大家介紹了java基礎(chǔ)理論Stream管道流Map操作方法示例解析,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步
    2022-03-03
  • Java實現(xiàn)在線預(yù)覽的示例代碼(openOffice實現(xiàn))

    Java實現(xiàn)在線預(yù)覽的示例代碼(openOffice實現(xiàn))

    本篇文章主要介紹了Java實現(xiàn)在線預(yù)覽的示例代碼(openOffice實現(xiàn)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 關(guān)于Java中@SuppressWarnings的正確使用方法

    關(guān)于Java中@SuppressWarnings的正確使用方法

    這篇文章主要介紹了關(guān)于Java中@SuppressWarnings的正確使用方法,@SuppressWarnings注解主要用在取消一些編譯器產(chǎn)生的警告對代碼左側(cè)行列的遮擋,有時候這會擋住我們斷點調(diào)試時打的斷點,需要的朋友可以參考下
    2023-05-05
  • Spring Boot整合FTPClient線程池的實現(xiàn)示例

    Spring Boot整合FTPClient線程池的實現(xiàn)示例

    這篇文章主要介紹了Spring Boot整合FTPClient線程池的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • java并發(fā)中DelayQueue延遲隊列原理剖析

    java并發(fā)中DelayQueue延遲隊列原理剖析

    DelayQueue隊列是一個延遲隊列,本文將結(jié)合實例代碼,詳細的介紹DelayQueue延遲隊列的源碼分析,感興趣的小伙伴們可以參考一下
    2021-06-06
  • mybatis多表查詢的實現(xiàn)(xml方式)

    mybatis多表查詢的實現(xiàn)(xml方式)

    本文主要介紹了mybatis多表查詢的實現(xiàn)(xml方式),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論