中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

廣東省建設(shè)廳網(wǎng)站優(yōu)化師培訓(xùn)機(jī)構(gòu)

廣東省建設(shè)廳網(wǎng)站,優(yōu)化師培訓(xùn)機(jī)構(gòu),丹陽(yáng)市住房和城鄉(xiāng)建設(shè)局網(wǎng)站,wordpress 房產(chǎn)模板重分區(qū)函數(shù) 如何對(duì)RDD中分區(qū)數(shù)目進(jìn)行調(diào)整(增加分區(qū)或減少分區(qū)),在RDD函數(shù)中主要有如下三個(gè)函數(shù)。 1)、增加分區(qū)函數(shù) 函數(shù)名稱:repartition,此函數(shù)使用的謹(jǐn)慎,會(huì)產(chǎn)生Shuffle。 2)、…

重分區(qū)函數(shù)

如何對(duì)RDD中分區(qū)數(shù)目進(jìn)行調(diào)整(增加分區(qū)或減少分區(qū)),在RDD函數(shù)中主要有如下三個(gè)函數(shù)。
1)、增加分區(qū)函數(shù)
函數(shù)名稱:repartition,此函數(shù)使用的謹(jǐn)慎,會(huì)產(chǎn)生Shuffle。
在這里插入圖片描述
2)、減少分區(qū)函數(shù)
函數(shù)名稱:coalesce,此函數(shù)不會(huì)產(chǎn)生Shuffle,當(dāng)且僅當(dāng)降低RDD分區(qū)數(shù)目。
比如RDD的分區(qū)數(shù)目為10個(gè)分區(qū),此時(shí)調(diào)用rdd.coalesce(12),不會(huì)對(duì)RDD進(jìn)行任何操作。
在這里插入圖片描述
3)、調(diào)整分區(qū)函數(shù)
在PairRDDFunctions(此類專門針對(duì)RDD中數(shù)據(jù)類型為KeyValue對(duì)提供函數(shù))工具類中
partitionBy函數(shù):
在這里插入圖片描述
范例演示代碼,適當(dāng)使用函數(shù)調(diào)整RDD分區(qū)數(shù)目:

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* RDD中分區(qū)函數(shù),調(diào)整RDD分區(qū)數(shù)目,可以增加分區(qū)和減少分區(qū)
*/
object SparkPartitionTest {
def main(args: Array[String]): Unit = {
// 創(chuàng)建應(yīng)用程序入口SparkContext實(shí)例對(duì)象
val sc: SparkContext = {
// 1.a 創(chuàng)建SparkConf對(duì)象,設(shè)置應(yīng)用的配置信息
val sparkConf: SparkConf = new SparkConf()
.setAppName(this.getClass.getSimpleName.stripSuffix("$"))
.setMaster("local[2]")
// 1.b 傳遞SparkConf對(duì)象,構(gòu)建Context實(shí)例
new SparkContext(sparkConf)
}
sc.setLogLevel("WARN")
// 讀取本地文件系統(tǒng)文本文件數(shù)據(jù)
val datasRDD: RDD[String] = sc.textFile("datas/wordcount/wordcount.data", minPartitions = 2)
// TODO: 增加RDD分區(qū)數(shù)
val etlRDD: RDD[String] = datasRDD.repartition(3)
println(s"EtlRDD 分區(qū)數(shù)目 = ${etlRDD.getNumPartitions}")
// 詞頻統(tǒng)計(jì)
val resultRDD: RDD[(String, Int)] = etlRDD
// 數(shù)據(jù)分析,考慮過濾臟數(shù)據(jù)
.filter(line => null != line && line.trim.length > 0)
// 分割單詞,注意去除左右空格
.flatMap(line => line.trim.split("\\s+"))
// 轉(zhuǎn)換為二元組,表示單詞出現(xiàn)一次
.mapPartitions{iter =>
iter.map(word => (word, 1))
}
// 分組聚合,按照Key單詞
.reduceByKey((tmp, item) => tmp + item)
// 輸出結(jié)果RDD
resultRDD
// TODO: 對(duì)結(jié)果RDD降低分區(qū)數(shù)目
.coalesce(1)
.foreachPartition(iter => iter.foreach(println))
// 應(yīng)用程序運(yùn)行結(jié)束,關(guān)閉資源
sc.stop()
}
}

在實(shí)際開發(fā)中,什么時(shí)候適當(dāng)調(diào)整RDD的分區(qū)數(shù)目呢?讓程序性能更好好呢????

第一點(diǎn):增加分區(qū)數(shù)目

  • 當(dāng)處理的數(shù)據(jù)很多的時(shí)候,可以考慮增加RDD的分區(qū)數(shù)目
    在這里插入圖片描述

第二點(diǎn):減少分區(qū)數(shù)目

  • 其一:當(dāng)對(duì)RDD數(shù)據(jù)進(jìn)行過濾操作(filter函數(shù))后,考慮是否降低RDD分區(qū)數(shù)目
    在這里插入圖片描述
  • 其二:當(dāng)對(duì)結(jié)果RDD存儲(chǔ)到外部系統(tǒng)
    在這里插入圖片描述

聚合函數(shù)

在數(shù)據(jù)分析領(lǐng)域中,對(duì)數(shù)據(jù)聚合操作是最為關(guān)鍵的,在Spark框架中各個(gè)模塊使用時(shí),主要就是其中聚合函數(shù)的使用。

集合中聚合函數(shù)
回顧列表List中reduce聚合函數(shù)核心概念:聚合的時(shí)候,往往需要聚合中間臨時(shí)變量。查看列表List中聚合函數(shù)reduce和fold源碼如下:
在這里插入圖片描述
通過代碼,看看列表List中聚合函數(shù)使用:
在這里插入圖片描述
運(yùn)行截圖如下所示:
在這里插入圖片描述
fold聚合函數(shù),比reduce聚合函數(shù),多提供一個(gè)可以初始化聚合中間臨時(shí)變量的值參數(shù):
在這里插入圖片描述
聚合操作時(shí),往往聚合過程中需要中間臨時(shí)變量(到底時(shí)幾個(gè)變量,具體業(yè)務(wù)而定),如下案例:
在這里插入圖片描述

RDD 中聚合函數(shù)
在RDD中提供類似列表List中聚合函數(shù)reduce和fold,查看如下:
在這里插入圖片描述
案例演示:求列表List中元素之和,RDD中分區(qū)數(shù)目為2,核心業(yè)務(wù)代碼如下:
在這里插入圖片描述
運(yùn)行原理分析:
在這里插入圖片描述
使用RDD中fold聚合函數(shù):
在這里插入圖片描述
查看RDD中高級(jí)聚合函數(shù)aggregate,函數(shù)聲明如下:
在這里插入圖片描述
業(yè)務(wù)需求:使用aggregate函數(shù)實(shí)現(xiàn)RDD中最大的兩個(gè)數(shù)據(jù),分析如下:
在這里插入圖片描述
核心業(yè)務(wù)代碼如下:
在這里插入圖片描述
運(yùn)行結(jié)果原理剖析示意圖:
在這里插入圖片描述

上述完整范例演示代碼:

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext, TaskContext}
import scala.collection.mutable
import scala.collection.mutable.ListBuffer
/**
* RDD中聚合函數(shù):reduce、aggregate函數(shù)
*/
object SparkAggTest {
def main(args: Array[String]): Unit = {
// 創(chuàng)建應(yīng)用程序入口SparkContext實(shí)例對(duì)象
val sc: SparkContext = {
// 1.a 創(chuàng)建SparkConf對(duì)象,設(shè)置應(yīng)用的配置信息
val sparkConf: SparkConf = new SparkConf()
.setAppName(this.getClass.getSimpleName.stripSuffix("$"))
.setMaster("local[2]")
// 1.b 傳遞SparkConf對(duì)象,構(gòu)建Context實(shí)例
new SparkContext(sparkConf)
}
sc.setLogLevel("WARN")
// 模擬數(shù)據(jù),1 到 10 的列表,通過并行方式創(chuàng)建RDD
val datas = 1 to 10
val datasRDD: RDD[Int] = sc.parallelize(datas, numSlices = 2)
// 查看每個(gè)分區(qū)中的數(shù)據(jù)
datasRDD.foreachPartition{iter =>
println(s"p-${TaskContext.getPartitionId()}: ${iter.mkString(", ")}")
}
println("=========================================")
// 使用reduce函數(shù)聚合
val result: Int = datasRDD.reduce((tmp, item) => {
println(s"p-${TaskContext.getPartitionId()}: tmp = $tmp, item = $item")
tmp + item
})
println(result)
println("=========================================")
// 使用fold函數(shù)聚合
val result2: Int = datasRDD.fold(0)((tmp, item) => {
println(s"p-${TaskContext.getPartitionId()}: tmp = $tmp, item = $item")
tmp + item
})
println(result2)
println("=========================================")
// 使用aggregate函數(shù)獲取最大的兩個(gè)值
val top2: mutable.Seq[Int] = datasRDD.aggregate(new ListBuffer[Int]())(
// 分區(qū)內(nèi)聚合函數(shù),每個(gè)分區(qū)內(nèi)數(shù)據(jù)如何聚合 seqOp: (U, T) => U,
(u, t) => {
println(s"p-${TaskContext.getPartitionId()}: u = $u, t = $t")
// 將元素加入到列表中
u += t //
// 降序排序
val top = u.sorted.takeRight(2)
// 返回
top
},
// 分區(qū)間聚合函數(shù),每個(gè)分區(qū)聚合的結(jié)果如何聚合 combOp: (U, U) => U
(u1, u2) => {
println(s"p-${TaskContext.getPartitionId()}: u1 = $u1, u2 = $u2")
u1 ++= u2 // 將列表的數(shù)據(jù)合并,到u1中
//
u1.sorted.takeRight(2)
}
)
println(top2)
// 應(yīng)用程序運(yùn)行結(jié)束,關(guān)閉資源
sc.stop()
}
}

PairRDDFunctions 聚合函數(shù)
在Spark中有一個(gè)object對(duì)象PairRDDFunctions,主要針對(duì)RDD的數(shù)據(jù)類型是Key/Value對(duì)的數(shù)據(jù)提供函數(shù),方便數(shù)據(jù)分析處理。比如使用過的函數(shù):reduceByKey、groupByKey等。*ByKey函數(shù):將相同Key的Value進(jìn)行聚合操作的,省去先分組再聚合。

第一類:分組函數(shù)groupByKey
在這里插入圖片描述
第二類:分組聚合函數(shù)reduceByKey和foldByKey
在這里插入圖片描述
但是reduceByKey和foldByKey聚合以后的結(jié)果數(shù)據(jù)類型與RDD中Value的數(shù)據(jù)類型是一樣的。

第三類:分組聚合函數(shù)aggregateByKey
在這里插入圖片描述
在企業(yè)中如果對(duì)數(shù)據(jù)聚合使用,不能使用reduceByKey完成時(shí),考慮使用aggregateByKey函數(shù),基本上都能完成任意聚合功能。

演示范例代碼如下:

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
/**
* RDD中聚合函數(shù),針對(duì)RDD中數(shù)據(jù)類型Key/Value對(duì):
* groupByKey
* reduceByKey/foldByKey
* aggregateByKey
* combineByKey
*/
object SparkAggByKeyTest {
def main(args: Array[String]): Unit = {
// 創(chuàng)建應(yīng)用程序入口SparkContext實(shí)例對(duì)象
val sc: SparkContext = {
// 1.a 創(chuàng)建SparkConf對(duì)象,設(shè)置應(yīng)用的配置信息
val sparkConf: SparkConf = new SparkConf()
.setAppName(this.getClass.getSimpleName.stripSuffix("$"))
.setMaster("local[2]")
// 1.b 傳遞SparkConf對(duì)象,構(gòu)建Context實(shí)例
new SparkContext(sparkConf)
}
sc.setLogLevel("WARN")
// 1、并行化集合創(chuàng)建RDD數(shù)據(jù)集
val linesSeq: Seq[String] = Seq(
"hadoop scala hive spark scala sql sql", //
"hadoop scala spark hdfs hive spark", //
"spark hdfs spark hdfs scala hive spark" //
)
val inputRDD: RDD[String] = sc.parallelize(linesSeq, numSlices = 2)
// 2、分割單詞,轉(zhuǎn)換為二元組
val wordsRDD: RDD[(String, Int)] = inputRDD
.flatMap(line => line.split("\\s+"))
.map(word => word -> 1)
// TODO: 先使用groupByKey函數(shù)分組,再使用map函數(shù)聚合
val wordsGroupRDD: RDD[(String, Iterable[Int])] = wordsRDD.groupByKey()
val resultRDD: RDD[(String, Int)] = wordsGroupRDD.map{ case (word, values) =>
val count: Int = values.sum
word -> count
}
println(resultRDD.collectAsMap())
// TODO: 直接使用reduceByKey或foldByKey分組聚合
val resultRDD2: RDD[(String, Int)] = wordsRDD.reduceByKey((tmp, item) => tmp + item)
println(resultRDD2.collectAsMap())
val resultRDD3 = wordsRDD.foldByKey(0)((tmp, item) => tmp + item)
println(resultRDD3.collectAsMap())
// TODO: 使用aggregateByKey聚合
/*
def aggregateByKey[U: ClassTag]
(zeroValue: U) // 聚合中間臨時(shí)變量初始值,類似fold函數(shù)zeroValue
(
seqOp: (U, V) => U, // 各個(gè)分區(qū)內(nèi)數(shù)據(jù)聚合操作函數(shù)
combOp: (U, U) => U // 分區(qū)間聚合結(jié)果的聚合操作函數(shù)
): RDD[(K, U)]
*/
val resultRDD4 = wordsRDD.aggregateByKey(0)(
(tmp: Int, item: Int) => {
tmp + item
},
(tmp: Int, result: Int) => {
tmp + result
}
)
println(resultRDD4.collectAsMap())
// 應(yīng)用程序運(yùn)行結(jié)束,關(guān)閉資源
Thread.sleep(1000000)
sc.stop()
}
}

面試題
RDD中g(shù)roupByKey和reduceByKey區(qū)別???

  • reduceByKey函數(shù):在一個(gè)(K,V)的RDD上調(diào)用,返回一個(gè)(K,V)的RDD,使用指定的reduce函數(shù),將相同key的值聚合到一起,reduce任務(wù)的個(gè)數(shù)可以通過第二個(gè)可選的參數(shù)來設(shè)置。
    在這里插入圖片描述
  • groupByKey函數(shù):在一個(gè)(K,V)的RDD上調(diào)用,返回一個(gè)(K,V)的RDD,使用指定的函數(shù),將相同key的值聚合到一起,與reduceByKey的區(qū)別是只生成一個(gè)sequence。
    在這里插入圖片描述
http://www.risenshineclean.com/news/65721.html

相關(guān)文章:

  • 網(wǎng)站建設(shè)營(yíng)銷詞可以免費(fèi)領(lǐng)取會(huì)員的軟件
  • 高縣住房和城鄉(xiāng)建設(shè)部網(wǎng)站百度文庫(kù)官網(wǎng)
  • 做網(wǎng)站的服務(wù)器百度網(wǎng)盤app下載安裝 官方下載
  • 保定市住房保障和城鄉(xiāng)建設(shè)局網(wǎng)站四川網(wǎng)站seo
  • 找券網(wǎng)站怎么做搜索引擎營(yíng)銷的簡(jiǎn)稱
  • 鄭州網(wǎng)絡(luò)科技有限公司網(wǎng)站首頁(yè)的優(yōu)化
  • 旅行社服務(wù)網(wǎng)點(diǎn)能否做網(wǎng)站百度瀏覽器app下載
  • 網(wǎng)站建設(shè)內(nèi)部問卷湖南正規(guī)seo優(yōu)化
  • 佛山專業(yè)建站公司哪家好公眾號(hào)排名優(yōu)化軟件
  • 如何編輯 wordpress 主題seo短視頻保密路線
  • 建立一個(gè)簡(jiǎn)單的企業(yè)官網(wǎng)seo現(xiàn)在還有前景嗎
  • 網(wǎng)站設(shè)計(jì)行業(yè)背景搜狗搜索引擎優(yōu)化指南
  • 新浪網(wǎng)站怎么做推廣域名注冊(cè)平臺(tái)哪個(gè)好
  • 哪個(gè)網(wǎng)站使用vue 做的全網(wǎng)營(yíng)銷網(wǎng)絡(luò)推廣
  • 網(wǎng)站建設(shè)推廣特色新人學(xué)會(huì)seo
  • 在線作圖軟件寧波seo外包代運(yùn)營(yíng)
  • 廣州網(wǎng)站備案企業(yè)網(wǎng)站seo推廣方案
  • 企業(yè)品牌網(wǎng)站建設(shè)費(fèi)用小姐關(guān)鍵詞代發(fā)排名
  • 深圳做網(wǎng)站推廣的公司哪家好長(zhǎng)沙網(wǎng)站seo推廣公司
  • 動(dòng)態(tài)手機(jī)網(wǎng)站怎么做seo是什么的簡(jiǎn)稱
  • 做網(wǎng)頁(yè)專題 應(yīng)該關(guān)注哪些網(wǎng)站360收錄提交入口網(wǎng)址
  • 優(yōu)秀設(shè)計(jì)師網(wǎng)站公司企業(yè)網(wǎng)站建設(shè)
  • 上海做網(wǎng)站哪家好山東濟(jì)南最新事件
  • 網(wǎng)站文章優(yōu)化事項(xiàng)百度競(jìng)價(jià)開戶流程
  • 張家口遠(yuǎn)大建設(shè)集團(tuán)網(wǎng)站怎么創(chuàng)建網(wǎng)站的快捷方式
  • 石家莊便宜做網(wǎng)站關(guān)鍵詞搜索方法
  • 網(wǎng)站后臺(tái)密碼忘記色盲測(cè)試圖第五版
  • 河南鄭州網(wǎng)站建設(shè)百度關(guān)鍵詞挖掘查排名工具
  • 網(wǎng)站開發(fā)的目的 實(shí)習(xí)報(bào)告百度云搜索引擎入口盤搜搜
  • 企業(yè)信息港網(wǎng)站建沒怎樣自己開發(fā)一款軟件