SparkSQL從2.0開(kāi)始已經(jīng)不再支持ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...)
這種語(yǔ)法了(下文簡(jiǎn)稱add columns語(yǔ)法)。如果你的Spark項(xiàng)目中用到了SparkSQL+Hive這種模式,從Spark1.x升級(jí)到2.x很有可能遇到這個(gè)問(wèn)題。
為了解決這個(gè)問(wèn)題,我們一般有3種方案可以選擇:
啟動(dòng)一個(gè)hiveserver2服務(wù),通過(guò)jdbc直接調(diào)用hive,讓hive執(zhí)行add columns語(yǔ)句。這種應(yīng)該是改起來(lái)最為方便的一種方式了,缺點(diǎn)就是,我們還需要在啟動(dòng)一個(gè)hiveserver服務(wù),多一個(gè)服務(wù)依賴,會(huì)增加整個(gè)系統(tǒng)的維護(hù)成本。
SparkSQL+Hive這種模式,要求我們啟動(dòng)一個(gè)HiveMetastore服務(wù),給SparkSQL用,我們也可以在代碼中直接直接連接HiveMetastore去執(zhí)行add columns語(yǔ)句。這種方式的好處是不需要額外依賴其他服務(wù),缺點(diǎn)就是我們要自己調(diào)用HiveMetastore相關(guān)接口,自己管理SessionState,用起來(lái)比較麻煩。
最后一種方式就是直接修改Spark,讓他支持add columns語(yǔ)法。這種方式最大的好處就是我們?cè)械臉I(yè)務(wù)邏輯代碼不用動(dòng),問(wèn)題就在于,要求對(duì)Spark源碼有一定的了解,否則改起來(lái)還是挺費(fèi)勁的。這也是我寫(xiě)這篇文章的目的:讓大家能夠參考本文自行為Spark添加add columns語(yǔ)法支持。
OK,接下來(lái),我們進(jìn)入主題。
為Spark添加add columns語(yǔ)法支持
本文基于最新版的Spark 2.1.0,源碼地址:https://github.com/apache/spark/tree/branch-2.1
1. 改進(jìn)語(yǔ)法定義
Spark2.1開(kāi)始使用ANTLR來(lái)解析SQL語(yǔ)法,它的語(yǔ)法定義文件借鑒的Presto項(xiàng)目,我們?cè)赟park源碼中找到這個(gè)文件sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4
,做如下改