Spark第三課

1.分區規則

1.分區規則

shuffle
1.打亂順序
2.重新組合

1.分區的規則

默認與MapReduce的規則一致,都是按照哈希值取余進行分配.
一個分區可以多個組,一個組的數據必須一個分區

2. 分組的分區導致數據傾斜怎么解決?

  • 擴容 讓分區變多
  • 修改分區規則

3.HashMap擴容為什么必須是2的倍數?

當不是2的倍數時, 好多的位置取不到
比如 為5 01234 123都取不到
必須保證,相關的位數全是1,所以必定2的倍數 2的n次方
所以位運算不是什么時候都能用的
在這里插入圖片描述

2.轉換算子

1.單值轉換算子

1.filter過濾器

1.注意

過濾只是將數據進行校驗,而不是修改數據. 結果為true就保留,false就丟棄
在這里插入圖片描述

2.代碼

JavaSparkContext sc = new JavaSparkContext("local[*]","filter");List<String> dataList = Arrays.asList("giao","giao2","zhangsan","lisi");
JavaRDD<String> rdd1 = sc.parallelize(dataList);
//JavaRDD<String> rddFilter1 = rdd1.filter(null);
JavaRDD<String>  rddFilter2= rdd1.filter(s->s.substring(0,1).toLowerCase().equals("g"));
//rddFilter1.collect().forEach(System.out::println);
System.out.println("----------------------------");
rddFilter2.collect().forEach(System.out::println);

在這里插入圖片描述

2.dinstinct

1.原理

分組
通過使用分組取重,相同的話,都是一個組了,所以Key唯一
應該是先分組,然后吧K提出來就好了

2.代碼

JavaSparkContext sc = new JavaSparkContext("local[*]","Distinct");List<String> dataList = Arrays.asList("giao1","gg1","gg1","gg2","gg2","gg1","gg3","gg1","gg5","gg3");
JavaRDD<String> rdd1 = sc.parallelize(dataList);
JavaRDD<String> rddDistinct = rdd1.distinct();
rddDistinct.collect().forEach(System.out::println);

在這里插入圖片描述

3.排序

1.介紹

sortby方法需要傳3個參數
參數1 排序規則
參數2 升序還是降序(false) 默認升序(true)
參數3 排序的分區數量(說明方法底層是靠shuffle實現,所以才有改變分區的能力)

2.排序規則

排序規則,是按照結果去排序
其實是用結果生成一個K值,通過K值進行排序,然后展示 V值
或者說權值, 按照權值排序
將Value變成K V

3.代碼

 public static void main(String[] args) {JavaSparkContext sc = new JavaSparkContext("local[*]","SparkSort");List<String> dataList = Arrays.asList("kunkun","giaogiao","GSD","JJ","chenzhen","Lixiaolong");JavaRDD<String> rdd1 = sc.parallelize(dataList);JavaRDD<String> rddSort = rdd1.sortBy(s -> {switch (s.substring(0, 1).toLowerCase()) {case "k":return 5;case "g":return 3;case "j":return 1;case "c":return 2;case "l":return 4;}return null;}, false, 3);rddSort.collect().forEach(System.out::println);}

2.鍵值對轉換算子

1.介紹

1.什么是鍵值對轉換算子

如何區分是鍵值對方法還是單值方法呢?
通過參數來判斷, 如果參數是一個值,就是單值,如果是2個,就是鍵值對

2.元組是不是鍵值對?

public static void main(String[] args) {JavaSparkContext sc = new JavaSparkContext("local[*]","KVRDD");List<Integer> dataList = Arrays.asList(1, 2, 3, 4, 5);JavaRDD<Integer> rdd1 = sc.parallelize(dataList);JavaRDD<Tuple2> rddmap = rdd1.map(num -> new Tuple2(num, num));rddmap.collect().forEach(System.out::println);
}

在這里插入圖片描述
答案是,不是,因為這個的返回值,是一個元組,而元組整體,是一個單值,所以,是單值
只有返回值 是RDD<K1,V1 >的時候,才是鍵值對類型算子

3. 使用Pair轉換鍵值對算子

public static void main(String[] args) {JavaSparkContext sc  = new JavaSparkContext("local[*]","RddPair");List<Integer> dataList = Arrays.asList(1, 2, 3, 4, 5);JavaRDD<Integer> rdd = sc.parallelize(dataList);JavaPairRDD<Integer, Integer> rddPair = rdd.mapToPair(num -> new Tuple2<>(num, num));rddPair.collect().forEach(System.out::println);}

在這里插入圖片描述

4.直接在獲取時轉換鍵值對

這里使用的是parallelizePairs方法 獲取的是JavaPairRDD

public static void main(String[] args) {JavaSparkContext sc = new JavaSparkContext("local[*]","KVRDD");JavaPairRDD<String, Integer> rddPair = sc.parallelizePairs(Arrays.asList(new Tuple2<>("a", 1),new Tuple2<>("a", 2),new Tuple2<>("b", 1),new Tuple2<>("b", 1),new Tuple2<>("c", 2),new Tuple2<>("c", 1)));rddPair.collect().forEach(System.out::println);}

在這里插入圖片描述

5.分組來獲取鍵值對


```java
public static void main(String[] args) {JavaSparkContext sc  = new JavaSparkContext("local[*]","RddPair");List<String> dataList = Arrays.asList("aa","bb","aa","bb","cc");JavaRDD<String> rdd = sc.parallelize(dataList);JavaPairRDD<Object, Iterable<String>> rddGroup = rdd.groupBy(s->s);rddGroup.collect().forEach(System.out::println);
}

在這里插入圖片描述

2.mapValue方法

1.介紹

直接對value進行操作,不需要管K
當然,也有mapKey方法可以無視Value操作Key

2.代碼演示

  public static void main(String[] args) {JavaSparkContext sc = new JavaSparkContext("local[*]","KVRDD");JavaPairRDD<String, Integer> rddPair = sc.parallelizePairs(Arrays.asList(new Tuple2<>("a", 1),new Tuple2<>("a", 2),new Tuple2<>("b", 1),new Tuple2<>("b", 1),new Tuple2<>("c", 2),new Tuple2<>("c", 1)));JavaPairRDD<String, Integer> mapV = rddPair.mapValues(num -> num * 2);mapV.collect().forEach(System.out::println);}

在這里插入圖片描述

3.WordCount實現

iter.spliterator().estimateSize());
spliterator
Spliterator(Split Iterator)是Java 8引入的一個新接口,用于支持并行遍歷和操作數據。它是Iterator的擴展,可以用于在并行流(Parallel Stream)中對數據進行劃分和遍歷,從而實現更高效的并行處理
spliterator()方法是在Iterable接口中定義的一個默認方法,用于生成一個Spliterator對象,以支持數據的并行遍歷。它的具體作用是將Iterable中的數據轉換為一個可以在并行流中使用的Spliterator對象。

estimateSize

estimateSize()方法是Java中Spliterator接口的一個方法,用于估算Spliterator所包含的元素數量的大小。Spliterator是用于支持并行遍歷和操作數據的接口,而estimateSize()方法提供了一個估計值,用于在處理數據時預測Spliterator包含的元素數量。

public static void main(String[] args) {JavaSparkContext sc  = new JavaSparkContext("local[*]","RddPair");List<String> dataList = Arrays.asList("aa","bb","aa","bb","cc");JavaRDD<String> rdd = sc.parallelize(dataList);JavaPairRDD<Object, Iterable<String>> rddGroup = rdd.groupBy(s->s);JavaPairRDD<Object, Long> wordCount = rddGroup.mapValues(iter -> iter.spliterator().estimateSize());wordCount.collect().forEach(System.out::println);
}

在這里插入圖片描述

3.groupby 與groupByKey

1 .代碼

public static void main(String[] args) {JavaSparkContext sc = new JavaSparkContext("local[*]","G1");JavaPairRDD<String, Integer> rddPair;rddPair = sc.parallelizePairs(Arrays.asList(new Tuple2<>("a", 1),new Tuple2<>("a", 2),new Tuple2<>("b", 1),new Tuple2<>("b", 1),new Tuple2<>("c", 2),new Tuple2<>("c", 1)));JavaPairRDD<String, Iterable<Integer>> rddGroupByKey = rddPair.groupByKey();JavaPairRDD<String, Iterable<Tuple2<String, Integer>>> rddGroupBy = rddPair.groupBy(t -> t._1);rddGroupByKey.collect().forEach(System.out::println);}

在這里插入圖片描述

2.分析區別

  • 1.參數
    GroupBy是自選規則 而GroupByKey是將PairRDD的Key當做分組規則
  • 2.結果
    GroupBy是將作為單值去分組,即使RDD是Pair, 而GroupByKey 則是將K V分開 ,將V作為組成員

3.注意

GroupByKey是不能進行隨意使用的,底層用的含有shuffle,如果計算平均值,就不能通過GroupByKey直接進行計算.

4.reduce與reduceByKey

1.介紹

多個變量進行同樣的運算規則
Stream是1.8新特性,
計算的本質 兩兩結合
在這里插入圖片描述
reduce

2. 代碼

  public static void main(String[] args) {JavaSparkContext sc = new JavaSparkContext("local[*]","Reduce");JavaPairRDD<String, Integer> rddPair;rddPair = sc.parallelizePairs(Arrays.asList(new Tuple2<>("a", 1),new Tuple2<>("a", 2),new Tuple2<>("b", 1),new Tuple2<>("b", 1),new Tuple2<>("c", 2),new Tuple2<>("c", 1)));rddPair.reduceByKey(Integer::sum).collect().forEach(System.out::println);}

在這里插入圖片描述

3.理解

相同Key值的V進行運算,所以底層是有分組的,所以底層是一定有Shuffle,一定有改變分區的能力,改變分區數量和分區規則.

4.與groupByKey區別

reduceByKey
將相同key的數量中1的V進行兩兩聚合
在這里插入圖片描述
reduceByKey 相同的key兩兩聚合,在shuffle落盤之前對分區內數據進行聚合,這樣會減少落盤數據量,并不會影響最終結果(預聚合) 這就是combine
在這里插入圖片描述

有錢先整IBM小型機

Shuffle優化
1.花錢
2.調大緩沖區(溢出次數減少)
3.

sortByKey
想比較必須實現可比較的接口
默認排序規則為升序,
通過K對鍵值對進行排序

行動算子
通過調用RDD方法讓Spark的功能行動起來
在這里插入圖片描述
map 是在new
在這里插入圖片描述

轉換算子 得到的是RDD
注意 轉換跑不起來 行動能跑起來 這句話是錯誤的

當使用sort時,也是能跑起來的,但是還是轉換算子
在這里插入圖片描述
第一行運行占用內存,第一個for 運算需要內存,但是第一行占用了大量內存,所以第一行浪費了,這就需要懶加載,所以第一行的執行時機是在第二個for運行前使用的.

注意map collect 不是懶加載,只是沒人調用他的job(RDD算子內部的代碼)
RDD算子外部的代碼都是在Driver端

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42665.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42665.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42665.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[JavaWeb]【七】web后端開發-MYSQL

前言&#xff1a;MySQL是一種流行的關系型數據庫管理系統,它的作用是存儲和管理數據。在Web開發中,MySQL是必備的數據庫技能之一,因為它可以幫助Web開發人員處理大量的數據,并且提供了強大的數據查詢和管理功能。 一 數據庫介紹 1.1 什么是數據庫 1.2 數據庫產品 二 MySQL概述…

Servlet+JDBC實戰開發書店項目講解第六篇:訂單實現

ServletJDBC實戰開發書店項目講解第六篇&#xff1a;訂單實現 1. 數據庫設計 在訂單實現之前&#xff0c;我們需要對數據庫進行相應的設計。在這個書店項目中&#xff0c;我們可以創建以下兩個表來實現訂單功能&#xff1a; 1.1 訂單表(Order) 訂單ID(order_id)&#xff1a…

vue3 實現簡單瀑布流

一、整理思路 實際場景中&#xff0c;瀑布流一般由 父組件 提供 數據列表&#xff0c;子組件渲染每個圖片都是根據容器進行 絕對定位 &#xff0c;從而定好自己的位置取出 屏幕的寬度&#xff0c;設定 圖片的寬度 固定 為一個值&#xff0c;計算可以鋪 多少列按列數 先鋪上第一…

使用Julia進行核遞歸最小二乘算法(KRLS)的解析與實現

F 標題&#xff1a; 使用Julia進行核遞歸最小二乘算法&#xff08;KRLS&#xff09;的深度解析與實現 第一部分&#xff1a; 核遞歸最小二乘算法 (KRLS) 是一個在線核回歸算法&#xff0c;這種算法的主要特點是能夠一次處理一個樣本&#xff0c;并構建一個訓練點字典&#xf…

5G科技防汛,助力守護一方平安

“立秋雖已至&#xff0c;炎夏尚還在”&#xff0c;受臺風席卷以及季節性影響全國多地正面臨強降水的嚴峻挑戰。“落雨又順秋&#xff0c;綿綿雨不休”&#xff0c;正值“七下八上” 防汛關鍵時期&#xff0c;貴州省水文水資源局已全面進入備戰狀態。 為確保及時響應做好防汛搶…

Vue3 setup新特性簡單應用

去官網學習→組合式 API&#xff1a;setup() | Vue.js 運行示例&#xff1a; 代碼&#xff1a;App.vue <template><div class"home"><img alt"Vue logo" src"../assets/logo.png"><!-- msg 組件傳遞數據 --><Hell…

VBA_MF系列技術資料1-157

MF系列VBA技術資料 為了讓廣大學員在VBA編程中有切實可行的思路及有效的提高自己的編程技巧&#xff0c;我參考大量的資料&#xff0c;并結合自己的經驗總結了這份MF系列VBA技術綜合資料&#xff0c;而且開放源碼&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04屬于定…

MySQL 面試題

一、數據庫基礎 1、MySQL 有哪些數據庫類型? (1) 整數類型&#xff1a; TINYINT 1 字節 SMALLINT 2 字節 MEDIUMINT 3 字節 INT 4 字節 BIGINT 8 字節 ① 任何整數類型都可以加上 UNSIGNED …

【學會動態規劃】最長湍流子數組(23)

目錄 動態規劃怎么學&#xff1f; 1. 題目解析 2. 算法原理 1. 狀態表示 2. 狀態轉移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后&#xff1a; 動態規劃怎么學&#xff1f; 學習一個算法沒有捷徑&#xff0c;更何況是學習動態規劃&#xff0c; 跟我…

vue+elementui 實現文本超出長度顯示省略號,鼠標移上懸浮展示全部內容

一、場景 表單內的輸入框一般為固定寬度&#xff0c;當輸入框內容長度超出輸入框寬度時&#xff0c;需要顯示省略號&#xff0c;并設置鼠標移到輸入框上時懸浮展示全部內容。 <el-tooltipplacement"top-start"effect"light":content"basicData[Or…

在 IDEA 中使用 Git開發 圖文教程

在 IDEA 中使用 Git開發 圖文教程 一、連接遠程倉庫二、IDEA利用Git進行開發操作三、分支操作3.1 新建分支3.2 切換分支3.3 刪除分支3.4 比較分支3.5 合并分支 四、常用快捷鍵 一、連接遠程倉庫 一、打開IDEA&#xff0c;進入目錄&#xff1a;File ->New ->Project from…

Skywalking全鏈路追蹤【學習筆記】

Skywalking全鏈路追蹤的服務搭建&#xff0c;使用docker進行安裝。 搭建服務 搭建【ES】 # 拉取 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.10 # 啟動 docker run -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.typesingle-nod…

什么是 SPI,和API有什么區別?

面試回答 Java 中區分 API 和 SPI&#xff0c;通俗的講&#xff1a;API 和 SPI 都是相對的概念&#xff0c;他們的差別只在語義上&#xff0c;API 直接被應用開發人員使用&#xff0c;SPI 被框架擴展人員使用。 API Application Programming Interface 大多數情況下&#xff…

opencv 矩陣運算

1.矩陣乘&#xff08;*&#xff09; Mat mat1 Mat::ones(2,3,CV_32FC1);Mat mat2 Mat::ones(3,2,CV_32FC1);Mat mat3 mat1 * mat2; //矩陣乘 結果 2.元素乘法或者除法&#xff08;mul&#xff09; Mat m Mat::ones(2, 3, CV_32FC1);m.at<float>(0, 1) 3;m.at…

瀏覽器控制臺調試實用方法

許多程序員僅知道控制臺的console.log&#xff0c;其實控制臺API還包含一些其他實用方法&#xff0c; 這些方法在前端調試時會很有幫助。 目錄 console.dir 查看對象屬性和方法 輸出DOM元素 console.error console.time和console.timeEnd console.log console.clear 總結…

set NOCOUNT on

SET NOCOUNT ON 是一條 SQL 語句&#xff0c;用于禁止在執行查詢時返回受影響的行數消息。通常&#xff0c;當執行 INSERT、UPDATE、DELETE 等操作時&#xff0c;數據庫會返回一個消息&#xff0c;表示受影響的行數。但在某些情況下&#xff0c;你可能希望禁用這些消息&#xf…

(五)、深度學習框架源碼編譯

1、源碼構建與預構建&#xff1a; 源碼構建&#xff1a; 源碼構建是通過獲取軟件的源代碼&#xff0c;然后在本地編譯生成可執行程序或庫文件的過程。這種方法允許根據特定需求進行配置和優化&#xff0c;但可能需要較長的時間和較大的資源來編譯源代碼。 預構建&#xff1a; 預…

dubbo與zookeeper

ZooKeeper 在 Dubbo 應用中的作用 ZooKeeper 是一個開源的分布式協調服務&#xff0c;它在 Dubbo 中被廣泛使用來實現服務注冊、發現和配置管理等功能。在 Dubbo 架構中&#xff0c;ZooKeeper 扮演了一個重要的角色&#xff0c;可以提供以下功能&#xff1a; ZooKeeper 是一個開…

2023年05月 C/C++(二級)真題解析#中國電子學會#全國青少年軟件編程等級考試

第1題:數字放大 給定一個整數序列以及放大倍數x,將序列中每個整數放大x倍后輸出。 時間限制:1000 內存限制:65536 輸入 包含三行: 第一行為N,表示整數序列的長度(N ≤ 100); 第二行為N個整數(不超過整型范圍),整數之間以一個空格分開; 第三行包含一個整數(不超過整…

【RocketMQ】SpringBoot集成RocketMQ

SpringBoot集成RocketMQ 首先依舊是引入依賴 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version> </dependency>然后就可以編寫發送不同類…