[原始碼解析]為什麼mapPartition比map更高效
阿新 • • 發佈:2020-06-03
# [原始碼解析]為什麼mapPartition比map更高效
[TOC]
## 0x00 摘要
自從函數語言程式設計和響應式程式設計逐漸進入到程式設計師的生活之後,map函式作為其中一個重要運算元也為大家所熟知,無論是前端web開發,手機開發還是後端伺服器開發,都很難逃過它的手心。而在大資料領域中又往往可以見到另外一個運算元mapPartition的身影。在效能調優中,經常會被建議儘量用 mappartition 操作去替代 map 操作。本文將從Flink原始碼和示例入手,為大家解析為什麼mapPartition比map更高效。
## 0x01 map vs mapPartition
### 1.1 map
Map的作用是將資料流上每個元素轉換為另外的元素,比如`data.map { x => x.toInt }`。它把`陣列流`中的每一個值,使用所提供的函式執行一遍,一一對應。得到與元素個數相同的`陣列流`。然後返回這個新資料流。
### 1.2 mapPartition
MapPartition的作用是單個函式呼叫並行分割槽,比如`data.mapPartition { in => in map { (_, 1) } }`。該函式將分割槽作為“迭代器”,可以產生任意數量的結果。每個分割槽中的元素數量取決於並行度和以前的operations。
### 1.3 異同
其實,兩者完成的業務操作是一樣的,本質上都是將資料流上每個元素轉換為另外的元素。
區別主要在兩點。
**從邏輯實現來講**,
- map邏輯實現簡單,就是在函式中簡單一一轉換,map函式的輸入和輸入都是單個元素。
- mapPartition相對複雜,函式的輸入有兩個,一般格式為 `void mapPartition(