国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spark的reduceByKey方法使用

這篇具有很好參考價(jià)值的文章主要介紹了Spark的reduceByKey方法使用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、需求

在ODPS上我們有如下數(shù)據(jù):

id category_id attr_id attr_name attr_value
205348 10000046 2 最優(yōu)粘度 ["0W-40"]
205348 10000046 1 基礎(chǔ)油類(lèi)型 ["全合成"]
205348 10000046 3 級(jí)別 ["BMW Longlife 01"]

我們希望得到的結(jié)果如下:

(205348,?10000046, "基礎(chǔ)油類(lèi)型:全合成\n最優(yōu)粘度:0W-40\n級(jí)別:BMW Longlife 01\n")

需求解讀:

需要將(id, category_id)作為key,然后將(attr_id, attr_name, attr_value)進(jìn)行reduce操作,在reduce之后的數(shù)據(jù)中對(duì)attr_id進(jìn)行排序,再將attr_name和attr_value合并在一起。

二、reduce操作之字符串方式

這個(gè)是最簡(jiǎn)單的方式,大致思路如下:

首先,將(id, category_id)作為key。

然后,將attr_id、attr_name、attr_value合并成一個(gè)字符串a(chǎn)ttr_info:attr_id + "#" + attr_name + "#" + attr_value,然后attr_info再通過(guò)"&"進(jìn)行合并。

示例代碼如下:

xx.map{case(id, category_id, attr_id, attr_name, attr_value) => ((id, category_id), attr_id + "#" + attr_name + "#" + attr_value)}
	.reduceByKey(_ + "&" + _, 100)

然后在接下來(lái)的流程中首先split("#")得到不同的attr信息,再通過(guò)split("&")得到不同的attr的列信息。這就要求attr_id,attr_name,attr_value中不能包含"#"和"&"字符串。

所以這種方式有缺陷,就是當(dāng)attr_id,attr_name,attr_value包含了"#"和"&"字符串時(shí)需要先replace一下,這樣就改變了原數(shù)據(jù)的值。

三、reduce操作之列表方式

這種方式相對(duì)復(fù)雜一點(diǎn),需要對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理,但是邏輯清晰。

輸入數(shù)據(jù)中(id, category_id)是key保持不變,(item_id, item_name, item_value)是一組tuple。

reduce操作會(huì)在同一個(gè)partition中,不同的partition之間進(jìn)行數(shù)據(jù)合并,這要求數(shù)據(jù)的輸入、輸出類(lèi)型保持不變

spark reducebykey用法,spark,spark,java,ajax

我們的初步想法:將item_id, item_name, item_value分別放到3個(gè)列表中,合并時(shí)就是列表之間的合并,合并完畢后使用時(shí)只需要遍歷列表即可。

因?yàn)閞educe操作的輸入、輸出類(lèi)型不能變化,所以先放item_id, item_name, item_value初始化為一個(gè)列表,然后再進(jìn)行列表之間的合并。

示例代碼如下:

xx.map{case(id, category_id, attr_id, attr_name, attr_value) => 
	  val itemIdList = new ArrayList[Long]()
	  itemIdList.add(attr_id)
	  val itemNameList = new ArrayList[String]()
	  itemNameList.add(attr_name)
	  val itemValueList = new ArrayList[String]()
	  itemValueList.add(attr_value)
	  ((id, category_id), (itemIdList, itemNameList, itemValueList))

}.reduceByKey((x, y) => {
	  val itemIdList = new ArrayList[Long]()
	  for(i <- 0 until x._1.size()){
		itemIdList.add(x._1.get(i))
	  }
	  for(i <- 0 until y._1.size()){
		itemIdList.add(y._1.get(i))
	  }

	  val itemNameList = new ArrayList[String]()
	  for(i <- 0 until x._2.size()){
		itemNameList.add(x._2.get(i))
	  }
	  for(i <- 0 until y._2.size()){
		itemNameList.add(y._2.get(i))
	  }

	  val itemValueList = new ArrayList[String]()
	  for(i <- 0 until x._3.size()){
		itemValueList.add(x._3.get(i))
	  }
	  for(i <- 0 until y._3.size()){
		itemValueList.add(y._3.get(i))
	  }

	  (itemIdList, itemNameList, itemValueList)
}, 100)

再簡(jiǎn)單一點(diǎn)如下示例:

?

carCaseRawInfo.map(x => {
      val stepInfoList = new util.ArrayList[(Long, String, String, String)]()
      stepInfoList.add((x._4, x._5, x._6, x._7))

      ((x._1, x._3, x._3), stepInfoList)
    })
      .reduceByKey((x, y) => {
        val stepInfoList = new ArrayList[(Long, String, String, String)]()
        for(i <- 0 until x.size()){
          stepInfoList.add(x.get(i))
        }
        for(i <- 0 until y.size()){
          stepInfoList.add(y.get(i))
        }

        stepInfoList
      }, GlobalConfig.DEFAULT_PARTITIONS_NUM)

四、reduce之partition屬性

首先提一下Shuffle過(guò)程,它的本意是洗牌、混亂的意思,類(lèi)似于java中的Colletions.shuffle(List)方法,它會(huì)隨機(jī)地打亂參數(shù)list里地元素順序。MapReduce的Shuffle過(guò)程大致可以理解成:數(shù)據(jù)從map task輸出到reduce task輸入的這段過(guò)程。

而partition過(guò)程:分割map每個(gè)節(jié)點(diǎn)的結(jié)果,按照key分別映射給不同的reduce,這個(gè)是可以自定義的。

通過(guò)設(shè)置reduce中的numPartitions值,會(huì)在reduce操作之后進(jìn)行repartition,避免數(shù)據(jù)不均衡堆在一個(gè)partition中。

五、reduceByKey和groupByKey的區(qū)別

從 shuffle 的角度: reduceByKey 和 groupByKey 都存在 shuffle 的操作,但是 reduceByKey可以在 shuffle 前對(duì)分區(qū)內(nèi)相同 key 的數(shù)據(jù)進(jìn)行預(yù)聚合(combine)功能,這樣會(huì)減少落盤(pán)的數(shù)據(jù)量,而 groupByKey 只是進(jìn)行分組,不存在數(shù)據(jù)量減少的問(wèn)題,reduceByKey 性能比較高。

從功能的角度: reduceByKey 其實(shí)包含分組和聚合的功能。GroupByKey 只能分組,不能聚合,所以在分組聚合的場(chǎng)合下,推薦使用 reduceByKey,如果僅僅是分組而不需要聚合。那么還是只能使用 groupByKey 。reduceByKey的分區(qū)內(nèi)和分區(qū)間的計(jì)算規(guī)則是一樣的文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-852610.html

到了這里,關(guān)于Spark的reduceByKey方法使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java語(yǔ)言在Spark3.2.4集群中使用Spark MLlib庫(kù)完成XGboost算法

    XGBoost是一種基于決策樹(shù)的集成學(xué)習(xí)算法,它在處理結(jié)構(gòu)化數(shù)據(jù)方面表現(xiàn)優(yōu)異。相比其他算法,XGBoost能夠處理大量特征和樣本,并且支持通過(guò)正則化控制模型的復(fù)雜度。XGBoost也可以自動(dòng)進(jìn)行特征選擇并對(duì)缺失值進(jìn)行處理。 1、導(dǎo)入相關(guān)庫(kù) 2、加載數(shù)據(jù) 3、準(zhǔn)備特征向量 4、劃分

    2023年04月12日
    瀏覽(15)
  • Java語(yǔ)言在Spark3.2.4集群中使用Spark MLlib庫(kù)完成樸素貝葉斯分類(lèi)器

    Java語(yǔ)言在Spark3.2.4集群中使用Spark MLlib庫(kù)完成樸素貝葉斯分類(lèi)器

    貝葉斯定理是關(guān)于隨機(jī)事件A和B的條件概率,生活中,我們可能很容易知道P(A|B),但是我需要求解P(B|A),學(xué)習(xí)了貝葉斯定理,就可以解決這類(lèi)問(wèn)題,計(jì)算公式如下: ? ? P(A)是A的先驗(yàn)概率 P(B)是B的先驗(yàn)概率 P(A|B)是A的后驗(yàn)概率(已經(jīng)知道B發(fā)生過(guò)了) P(B|A)是

    2023年04月12日
    瀏覽(19)
  • Spark SQL示例用法所有函數(shù)示例權(quán)威詳解一【建議收藏】

    Spark中所有功能的入口點(diǎn)是 SparkSession 類(lèi)。要?jiǎng)?chuàng)建一個(gè)基本的 SparkSession ,只需使用 SparkSession.builder() : 完整示例代碼可在Spark存儲(chǔ)庫(kù)的“examples/src/main/scala/org/apache/spark/examples/sql/SparkSQLExample.scala”中找到。 在Spark 2.0中, SparkSession 提供了 對(duì)Hive功能的內(nèi)置支持 ,包括 使用Hi

    2024年02月05日
    瀏覽(19)
  • 【Spark原理系列】Accumulator累加器原理用法示例源碼詳解

    源自專(zhuān)欄《SparkML:Spark ML系列專(zhuān)欄目錄》 Accumulator是Spark中的一種分布式變量,用于在并行計(jì)算中進(jìn)行累加操作。它是由MapReduce模型中的“全局計(jì)數(shù)器”概念演化而來(lái)的。 Accumulator提供了一個(gè)可寫(xiě)的分布式變量,可以在并行計(jì)算中進(jìn)行累加操作。在Spark中,當(dāng)一個(gè)任務(wù)對(duì)Accum

    2024年03月14日
    瀏覽(25)
  • 【Spark ML系列】Frequent Pattern Mining頻繁挖掘算法功能用法示例源碼論文詳解

    挖掘頻繁項(xiàng)、項(xiàng)集、子序列或其他子結(jié)構(gòu)通常是分析大規(guī)模數(shù)據(jù)集的首要步驟,在數(shù)據(jù)挖掘領(lǐng)域已經(jīng)成為一個(gè)活躍的研究課題。我們建議用戶(hù)參考維基百科上關(guān)于關(guān)聯(lián)規(guī)則學(xué)習(xí)的相關(guān)信息。 FP-growth算法在《Han et al., Mining frequent patterns without candidate generation》一文中進(jìn)行了描述

    2024年02月19日
    瀏覽(15)
  • 【spark】java類(lèi)在spark中的傳遞,scala object在spark中的傳遞

    記錄一個(gè)比較典型的問(wèn)題,先講一下背景,有這么一個(gè)用java寫(xiě)的類(lèi) 然后在spark中使用的時(shí)候: 原因: scala的object對(duì)應(yīng)的就是java的靜態(tài)成員,可以反過(guò)來(lái)理解java的所有靜態(tài)成員可被抽取成伴生對(duì)象(雖然現(xiàn)實(shí)中是scala最終編譯成java)。以上面的JavaClass0 例子可理解為等價(jià)的

    2024年02月11日
    瀏覽(22)
  • Spark內(nèi)存資源分配——spark.executor.memory等參數(shù)的設(shè)置方法

    Spark內(nèi)存資源分配——spark.executor.memory等參數(shù)的設(shè)置方法

    基于論壇上一些關(guān)于spark內(nèi)存設(shè)置的文章,我對(duì)一個(gè)項(xiàng)目中實(shí)際運(yùn)行的任務(wù)進(jìn)行了內(nèi)存參數(shù)分析和優(yōu)化。如果要了解更多詳細(xì)設(shè)置原理,可見(jiàn)文末的參考文章鏈接。 已知內(nèi)存分配存在通過(guò)用戶(hù)提交的參數(shù)設(shè)置進(jìn)行靜態(tài)分配,和yarn進(jìn)行動(dòng)態(tài)分配兩種,所以本文對(duì)兩種狀況都根據(jù)

    2023年04月13日
    瀏覽(36)
  • Spark數(shù)據(jù)傾斜及解決方法

    數(shù)據(jù)傾斜是指少量的Task運(yùn)行大量的數(shù)據(jù),可能會(huì)導(dǎo)致OOM。數(shù)據(jù)過(guò)量是所有的Task都很慢。避免數(shù)據(jù)傾斜的方式主要有: 按照Key分組后,一組數(shù)據(jù)拼接成一個(gè)字符串,這樣一個(gè)Key只有一條數(shù)據(jù)了。這個(gè)方式個(gè)人覺(jué)得有點(diǎn)僵硬。 增大或縮小Key的粒度:增大粒度一個(gè)Key包含更多的數(shù)

    2024年02月15日
    瀏覽(26)
  • Spark Executor端日志打印的方法

    大數(shù)據(jù)平臺(tái)采用yarn client模式提交spark 任務(wù),并且多個(gè)離線Spark作業(yè)共用一個(gè)Driver,好處便在于——節(jié)省提交任務(wù)的時(shí)間。但同時(shí)也加大了運(yùn)維工作的難度,因?yàn)槿蝿?wù)日志打印到同一個(gè)文件中。 為了區(qū)分開(kāi)各個(gè)業(yè)務(wù)流程的日志,平臺(tái)引入了log4j2 RoutingAppender,配置如下所示:

    2023年04月22日
    瀏覽(16)
  • 深入理解Spark編程中的map方法

    先上結(jié)論:不拘泥于形式,給一個(gè)東西,一頓操作,返回一個(gè)東西。且對(duì)每一條數(shù)據(jù)都相同的處理,處理完會(huì)生成新的東西,不改變之前你傳進(jìn)來(lái)的東西。 ? ? ? ?這個(gè)東西你可以理解為任何形式的數(shù)據(jù),如map里的,對(duì)象,各種形式文件等等。? 當(dāng)深入理解 map 方法時(shí),我們

    2024年01月24日
    瀏覽(37)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包