Spark 中的常見窄/寬轉換和Rule-Based/Cost-Based優化技術_窄轉換(narrow transformations)和寬轉換(wide transformations)
https://medium.com/@dvcanton/wide-and-narrow-dependencies-in-apache-spark-21acf2faf031 窄轉換(narrow transformations) 將各種類型的數據放在單獨的容器中。可以對每個數據容器執行操作,也可以在容器之間獨立行動數據,而無需交互或傳輸。窄轉換的範例包括修改單個數據片段、選擇特定項或組合兩個數據容器。 在窄轉換中,無需執行數據隨機排序操作即可傳輸數據。 當 父 RDD 的每個分區最多被子 RDD 的一個分區使用時 ,我們的依賴關係很窄。 一對一映射:子 RDD 中的每個分區最多依賴於父 RDD 中的一個分區。換言之, 子分區僅處理來自單個相應父分區的數據。 更快的執行速度 :窄依賴項支援流水線等優化。在流水線中, 一個轉換的輸出可以用作下一個轉換的輸入 ,而無需等待處理整個父 RDD。這提高了效率。 減少隨機排序:由於每個子分區都有一個特定的父分區可供訪問,因此無需通過網路對數據進行隨機排序。 例如: map 、 filter 和 union 轉換 備註:隨機排序是指數據在Spark集群中的不同 worker節點之間移動。 窄轉換常見例子 Map: Applying a function to each element in the data set. from pyspark import SparkContext sc = SparkContext( "local" , "MapExample" ) data = [ 1 , 2 , 3 , 4 , 5 ] rdd = sc.parallelize(data) mapped_rdd = rdd.map( lambda x: x * 2 ) mapped_rdd.collect() # Output: [2, 4, 6, 8, 10] Filter: Selecting elements based on a specified condition. from pyspark import SparkContext sc = SparkContext( "local" , "FilterExample" ) dat...