官术网_书友最值得收藏!

2.3 Spark 2.2 SQL

Spark 2.0通過(guò)對(duì)SQL 2003的支持增強(qiáng)了SQL功能,Catalyst新引擎提升了Spark查詢(xún)優(yōu)化的速度;本節(jié)對(duì)DataFrame和Dataset API、時(shí)間窗口進(jìn)行了講解。

Apache Spark 2.2.0版本中核心和Spark SQL的更新如下。

1.API更新

 SPARK-19107:支持使用DataFrameWriter和Catalog創(chuàng)建hive表。

 SPARK-13721:增加支持LATERAL VIEW OUTER explode()。

 SPARK-18885:統(tǒng)一數(shù)據(jù)源和hive serde表的CREATE TABLE語(yǔ)法。

 SPARK-16475:增加廣播提示BROADCAST、BROADCASTJOIN和MAPJOIN,用于SQL查詢(xún)。

 SPARK-18350:支持會(huì)話本地時(shí)區(qū)。

 SPARK-19261:支持ALTER TABLE table_name和COLUMNS。

 SPARK-20420:將事件增加到外部目錄。

 SPARK-18127:向Spark增加鉤子和擴(kuò)展點(diǎn)。

 SPARK-20576:在Dataset/DataFrame中支持通用提示功能。

 SPARK-17203:數(shù)據(jù)源選項(xiàng)應(yīng)始終不區(qū)分大小寫(xiě)。

 SPARK-19139:基于AES的Spark認(rèn)證機(jī)制。

2.性能優(yōu)化和系統(tǒng)穩(wěn)定性

基于成本的優(yōu)化:

 SPARK-17075 SPARK-17076 SPARK-19020 SPARK-17077 SPARK-19350:過(guò)濾filter,關(guān)聯(lián)join,聚合aggregate,投影project和限制limit/樣本運(yùn)算符sample的基數(shù)估計(jì)。

 SPARK-17080:基于成本的關(guān)聯(lián)重新排序。

 SPARK-17626:使用星形模式啟發(fā)的TPC-DS性能提升。

 SPARK-17949:引入基于JVM對(duì)象的聚合運(yùn)算符。

 SPARK-18186:HiveUDAFFunction的部分聚合支持。

 SPARK-18362 SPARK-19918:CSV和JSON的文件列表/I/O改進(jìn)。

 SPARK-18775:限制每個(gè)文件寫(xiě)入的最大記錄數(shù)。

 SPARK-18761:不可取消/不能被殺掉的任務(wù)不應(yīng)該資源短缺。

 SPARK-15352:拓?fù)渥R(shí)別塊復(fù)制。

3.其他變化

 SPARK-18352:支持解析多行JSON文件。

 SPARK-19610:支持解析多行CSV文件。

 SPARK-21079:分析分區(qū)表上的表命令。

 SPARK-18703:對(duì)Hive-serde表插入/CTAS完成后,刪除暫存目錄和數(shù)據(jù)文件。

 SPARK-18209:更強(qiáng)大的視圖規(guī)范化,無(wú)須完全SQL擴(kuò)展。

 SPARK-13446:[SPARK-18112]支持從Hive metastore 2.0/2.1讀取數(shù)據(jù)。

 SPARK-18191:使用提交協(xié)議的RDD API端口。

 SPARK-8425:增加黑名單機(jī)制進(jìn)行任務(wù)調(diào)度。

 SPARK-19464:刪除對(duì)Hadoop 2.5及更早版本的支持。

 SPARK-19493:刪除Java 7支持。

2.3.1 Spark SQL

Spark 2.0通過(guò)對(duì)SQL 2003的支持大幅增強(qiáng)了SQL功能,現(xiàn)在可以運(yùn)行所有99個(gè)TPC-DS查詢(xún)。這個(gè)版本中的SparkSQL主要有以下幾點(diǎn)改進(jìn):

(1)引入了支持ANSISQL和HiveSQL的本地解析器。

(2)本地實(shí)現(xiàn)DDL命令。

(3)支持非相關(guān)標(biāo)量子查詢(xún)。

(4)在Where與having條件中,支持(not)in和(not)exists。

(5)即使Spark沒(méi)有和Hive集成搭建,SparkSQL也支持它們一起搭建時(shí)的除了Hive連接、Hive UDF(User Defined Function用戶(hù)自定義函數(shù))和腳本轉(zhuǎn)換之外的大部分功能。

(6)Hive式的分桶方式的支持。

另外,Catalyst查詢(xún)優(yōu)化器對(duì)于常見(jiàn)的工作負(fù)載也有了很多提升,對(duì)如nullability propagation之類(lèi)的查詢(xún)做了更好的優(yōu)化。Catalyst查詢(xún)優(yōu)化器從最早的應(yīng)用于SparkSQL到現(xiàn)在應(yīng)用于DataSetAPI,對(duì)Spark程序的高效率運(yùn)行起到了非常重要的作用,并且隨著DataSetAPI的流行,以及優(yōu)化器自身的不斷演進(jìn),未來(lái)肯定會(huì)對(duì)Spark的所有框架帶來(lái)更高的執(zhí)行效率。

2.3.2 DataFrame和Dataset API

在Spark 1.X版本中,DataFrame的API存在很多問(wèn)題,如DataFrame不是類(lèi)型安全的(not type-safe)、不是面向?qū)ο蟮模╪ot object-oriented),為了克服這些問(wèn)題,Spark在1.6版本引入了Dataset,并在2.0版本的Scala和Java中將二者進(jìn)行了統(tǒng)一(在Python和R中,由于缺少類(lèi)型安全性,DataFrame仍是主要的編程接口),DataFrame成為DataSet[Row]的別名,而且Spark 2.0版本為DataSet的類(lèi)型化聚合加入了一個(gè)新的聚合器,讓基于DataSet的聚合更加高效。

在Spark 2.1版本中,DataFrame和Dataset API晉升為穩(wěn)定的API。也就是說(shuō),可以在生產(chǎn)實(shí)踐中使用它們,且后續(xù)會(huì)基于向后兼容的前提不斷強(qiáng)化。

DataSetAPI是High-LevelAPI,有更高的抽象級(jí)別,與RDDAPI這樣的Low-LevelAPI相比更加易用,它對(duì)于提升用戶(hù)的工作效率,以及提高程序的可讀性而言意義非凡。由于WholeStageCodeGeneration的引入,SparkSQL和DataSetAPI中的常見(jiàn)算子的性能提升了2~10倍。加上Catalyst查詢(xún)優(yōu)化器和Tungsten的幫助,用戶(hù)不用過(guò)多地關(guān)注對(duì)程序的優(yōu)化,也能獲得很好的執(zhí)行效率。

所以,毋庸置疑地,這樣一種簡(jiǎn)單高效的API將成為Spark未來(lái)主流的編程接口。

2.3.3 Timed Window

對(duì)于經(jīng)常用到復(fù)雜SQL的用戶(hù)而言,窗口函數(shù)一直以來(lái)都是不可或缺的,在Spark 2.X版本中,通過(guò)對(duì)Hive中的窗口函數(shù)的本地化實(shí)現(xiàn),使用Spark的內(nèi)存管理機(jī)制,從而提升了窗口函數(shù)的性能。

主站蜘蛛池模板: 清水河县| 互助| 斗六市| 东城区| 长顺县| 九龙县| 门源| 辽宁省| 仙居县| 大同市| 永春县| 大足县| 呼伦贝尔市| 湘阴县| 云霄县| 灵丘县| 体育| 怀集县| 南丰县| 右玉县| 南华县| 乐山市| 宜阳县| 乐昌市| 凭祥市| 昭觉县| 湘阴县| 闽清县| 中阳县| 武义县| 交口县| 乃东县| 二连浩特市| 清河县| 景德镇市| 盱眙县| 靖宇县| 太康县| 千阳县| 沧源| 北川|