此外,除了兼容HQL、加速現有Hive數據的查詢分析以外,Spark SQL還支持直接對原生RDD對象進行關系查詢。同時,除了HQL以外,Spark SQL還內建了壹個精簡的SQL parser,以及壹套Scala DSL。也就是說,如果只是使用Spark SQL內建的SQL方言或Scala DSL對原生RDD對象進行關系查詢,用戶在開發Spark應用時完全不需要依賴Hive的任何東西。
Spark SQL解決了這兩個問題。第壹,Spark SQL在Hive兼容層面僅依賴HQL parser、Hive Metastore和Hive SerDe。也就是說,從HQL被解析成抽象語法樹(AST)起,就全部由Spark SQL接管了。執行計劃生成和優化都由Catalyst負責。借助Scala的模式匹配等函數式語言特性,利用Catalyst開發執行計劃優化策略比Hive要簡潔得多。去年Spark summit上Catalyst的作者Michael Armbrust對Catalyst做了壹個簡要介紹:2013 | Spark Summit(知乎竟然不能自定義鏈接的文字?)。第二,相對於Shark,由於進壹步削減了對Hive的依賴,Spark SQL不再需要自行維護打了patch的Hive分支。Shark後續將全面采用Spark SQL作為引擎,不僅僅是查詢優化方面。
能夠對原生RDD對象進行關系查詢,個人認為大大降低了用戶門檻。壹方面當然是因為熟悉SQL的人比熟悉Spark API的人多,另壹方面是因為Spark SQL之下有Catalyst驅動的查詢計劃優化引擎。雖然在很多方面Spark的性能完爆Hadoop MapReduce好幾條街,但Spark的運行時模型也比MapReduce復雜不少,使得Spark應用的性能調優比較tricky。雖然從代碼量上來看,Spark應用往往是對等的MR應用的好幾分之壹,但裸用Spark API開發高效Spark應用還是需要花些心思的。這就體現出Spark SQL的優勢了:即便用戶寫出的查詢不那麽高效,Catalyst也可以自動應用壹系列常見優化策略。
.