由於Spark都是基於RDD的特性,所以可以用純RDD的方法,實現和Spark SQL一模一樣的功能。
之前在Spark Core中的數據傾斜的七種解決方案,全部都可以直接套用在Spark SQL上。
Spark SQL的數據傾斜解決方案:
- 聚合源數據:Spark Core和Spark SQL沒有任何區別
- 過濾導致傾斜的key:在sql中用where條件
- 提高shuffle並行度:groupByKey(1000),spark.sql.shuffle.partitions(默認是200)
- 雙重groupBy:改寫SQL,兩次groupBy
- reduce join轉換爲map join:spark.sql.autoBroadcastJoinThreshold(默認是10485760);可以自己將表做成RDD,自己手動去實現map join;SparkSQL內置的map join,默認如果有一個10M以內的小表,會將該表進行broadcast,然後執行map join;調節這個閾值,比如調節到20M、50M、甚至1G。
- 採樣傾斜key並單獨進行join:純Spark Core的一種方式,sample、filter等算子
- 隨機key與擴容表:Spark SQL+Spark Core