讓我們假設有一個大型數據集”A”,具有以下架構:

Java

 

 
1
2
|?empid整數
3
|?薩爾整數
|? 名稱字符串

5
|?地址字符串
6
|?dept部門整數

需要根據一組員工 ID(empIds)、”B”(可廣播給執行者)篩選數據集”A”,以獲得篩選的數據集”A”。篩選器操作可以表示為:

Java

 

x
1
1
A'=A.過濾器A.empId"B"中包含in

為了實現這種最常見的篩選方案,您可以在 Spark 中使用四種類型的轉換,每種轉換都有自己的優缺點。以下是所有這些轉換用于執行此特定篩選方案的使用情況,以及有關每個轉換的可靠性和效率方面的詳細說明。

過濾器:在數據集上篩選轉換(篩選布爾條件表達式上的數據集記錄或布爾返回篩選器函數),可按 以下方式使用

Java

 

x
1
1
1.數據集<T>A'=A.過濾器條件
2
2.數據集<T>A'=A.過濾器過濾器功能<T>func
3
3.數據集<T>A'=A.過濾器String字符串條件解釋

對于篩選方案,如前所述,可以使用”A”上的”篩選”轉換,該轉換以”篩選功能”作為輸入。在相應數據集的分區中包含的每個記錄上調用”Filter 函數”,并返回”true”或”false”

無論數據集”A”的大小如何,使用上述篩選器轉換都非常簡單、健壯且高效。這是因為,轉換是由記錄調用的。此外,由于廣播的 empIds 集由執行器上的哈希表支持,因此每個記錄的篩選器函數中的篩選查找仍然有效。

地圖:映射轉換(在數據集的每個記錄上應用一個函數以返回空、相同或不同的記錄類型),用于數據集,使用 方式如下

Java

 

x
1
 
1
數據集<U>A'=A

010437px;”>

對于篩選方案,如前所述,可以使用”A”上的”映射”轉換,該轉換以”Map 函數”作為輸入。在我們的篩選方案中,將在數據集”A”的每個記錄上調用”Map 函數”,并檢查記錄的”empId”是否存在于廣播的 empIds 集”B”(由相應的哈希表支持)。如果存在記錄,則從 Map 函數返回相同的記錄。如果記錄不存在,則 將返回 NULL。 此外,Map 函數的編碼器輸入與數據集”A”的編碼器輸入相同。

雖然,”Map 函數”的語義與”篩選功能”類似,但與直接的”篩選功能”轉換方法相比,使用上述”Map”轉換(如上述)的篩選方案并不太簡單和優雅。在轉換中必須顯式預配額外的編碼器輸入。此外,在調用”映射”轉換后,需要為 NULL 值篩選輸出,因此,使”映射”方法的效率低于”篩選”方法。但是,該方法的可靠性與”篩選器”方法類似,因為它無論大小為”A”,它都會毫無問題地運行。這是因為,”映射”轉換也是由記錄調用的。

Map 分區: 映射分區轉換在數據集上應用每個分區的函數(在我最近出版的書籍”火花分區指南火花分區深度解釋”中了解有關 Spark 分區的詳細了解),在數據集上將 null 或一個索引器返回到相同或不同記錄類型的新集合),用于 以下方式

Java

 

x
1
1
數據集<U>A'=A.地圖地圖部分功能<T,U>func編碼器<U>編碼器

對于篩選方案,如前所述,還可以使用”A”上的”映射部分”轉換,該轉換以”MapPartitions 功能”作為輸入。在我們的篩選方案中,將在數據集”A”的每個分區上調用”MapPartions 功能”,對分區的所有記錄進行次數,并檢查每個記錄,如果記錄的”empId”存在于廣播的 empIds 集”B”(由相應的哈希表支持)。如果存在記錄,則在”MapPartitions 功能”中初始化的可返回集合中將添加相同的記錄。最后,從”MapPartions 功能”返回可返回集合的運行器。

與”映射”和”篩選”方法相比,”映射分區”方法通常效率更高,因為它操作分區明智,而不是記錄明智。但是,與”映射”類似,在轉換中必須顯式預配編碼器輸入。此外,如果數據集’A’的某些分區的大小超過執行每個分區計算任務的內存,則”Map 分區”方法可能會變得非常不可靠。這是因為較大的分區可能會導致潛在的更大的可返回集合,導致內存溢出

apache.org/docs/latest/api/java/index.html?org/apache/spark/sql/Dataset.html”rel=”noopener noreferer”目標=”_blank”>如下:

Java

 

x
1
 
1
數據集<>A'=A.聯接Dataset數據集 <?>B聯接擴展

對于篩選方案,如前所述,還可以在”A”上使用”內部聯接”轉換,該轉換在聯接條件上加入”B”的數據集表示形式(AempId),并且僅從每個加入的記錄中選擇”A”字段。

“內部聯接”方法返回通用”Row”對象的數據集,因此需要使用編碼器將其轉換回 A 的記錄類型的數據集,以匹配確切的篩選器語義。但是,與”過濾”應用類似,”內聯接”方法高效可靠。效率來自這樣一個事實,即由于”B”是可廣播的 ,Spark 將選擇最有效的”博拉廣播哈希聯接”方法來執行聯接。此外,可靠性還來自這樣一個事實,即”內部聯接”方法將適用于”A”的大型數據集,就像”篩選”方法一樣。

考慮到所有的方法,我會從可靠性和效率的角度選擇”過濾器”方法作為最安全的賭注。此外,請注意,”篩選”方法還允許我執行具有類似效率和健壯性的反搜索,而”內部聯接”是不允許的。

此外,你可以在這里參考 我原來的故事。

Comments are closed.