名稱解析
適用於:磚的SQL磚運行時
名稱解析的過程標識符解決特定列、字段、參數,或表引用。
列、字段和參數分辨率
標識符在表達式可以引用任何下列之一:
列名基於一個視圖、表公共表表達式(CTE),或一個column_alias。
字段名地圖中的關鍵結構體或地圖。字段和密鑰永遠不可能不合格。
一個特殊的函數等
current_user
或當前日期
不需要使用哪一個()
。的
默認的
關鍵字的上下文中使用插入
,更新
,合並
設置默認的列值。
名稱解析應用以下原則:
的最親密的匹配參考獲勝,和
列和參數戰勝字段和鑰匙。
在細節,解決標識一個特定的參考遵循這些規則為:
本地引用
列引用
匹配的標識符,這可能是合格的,一個列名表引用的
從條款
。如果有不止一個這樣的匹配,提高了AMBIGUOUS_COLUMN_OR_FIELD錯誤。
無參數的函數引用
如果不合格的標識符和匹配
current_user
,當前日期
,或current_timestamp
:解決這些功能之一。列默認規範
如果標識符是不合格的,比賽
默認的
占整個表達式的上下文更新集
,插入值
,或合並當(不)匹配
:解決各自的默認的
目標表的價值插入
,更新
或合並
。結構體字段或地圖的關鍵參考
如果標識符是合格的,那麼努力匹配字段或地圖主要根據以下步驟:
刪除最後一個標識符,並把它作為一個領域或關鍵。
比賽剩下的一列表引用的
從條款
。如果有不止一個這樣的匹配,提高了AMBIGUOUS_COLUMN_OR_FIELD錯誤。
如果匹配列是:
結構體
:匹配字段。如果現場不能匹配,提高FIELD_NOT_FOUND錯誤。
如果有多個領域,提高AMBIGUOUS_COLUMN_OR_FIELD錯誤。
地圖
:報錯關鍵是合格的。一個運行時可能發生eror如果鍵實際上並不是出現在地圖上。
其他類型:提高一個錯誤。
重複前麵的步驟刪除標識符作為一個領域。應用規則(A)和(B)雖然有一個標識符左列來解釋。
側列別名
適用於:磚的SQL磚運行時12.2及以上
如果表達式是在一個
選擇
列表,匹配的主要標識符前列別名在那選擇
列表。如果有不止一個這樣的匹配,提高了AMBIGUOUS_LATERAL_COLUMN_ALIAS錯誤。
地圖匹配每個剩餘的標識符作為一個字段或鍵,和提高FIELD_NOT_FOUND或AMBIGUOUS_COLUMN_OR_FIELD如果他們不能匹配錯誤。
相關
橫向
如果查詢是之前
橫向
關鍵字,應用規則1。和1。d考慮表引用的從
包含查詢和前橫向
。常規的
如果查詢是一個標量子查詢,
在
,或存在
子查詢應用規則1。,1。d和2考慮包含查詢中的表引用的從
條款。
嵌套關係
重新應用規則3遍曆查詢的嵌套級別。
常規參數
如果表達式的一部分創建函數聲明:
匹配的標識符參數名稱。如果標識符是合格的,限定符的名稱必須匹配函數。
如果標識符是合格的,匹配的字段或地圖的關鍵參數後規則1.攝氏度
例子
——區分列和字段>選擇一個從值(1)作為t(一個);1>選擇t。一個從值(1)作為t(一個);1>選擇t。一個從值(named_struct(“一個”,1))作為t(t);1——列上precendece字段>選擇t。一個從值(named_struct(“一個”,1),2)作為t(t,一個);2——對內隱側列別名>選擇c1作為一個,一個+c1從值(2)作為T(c1);24——當地一個列引用優先,在橫向列別名>選擇c1作為一個,一個+c1從值(2,3)作為T(c1,一個);25——S.c3標量子查詢相關>選擇(選擇c1從值(1,2)作為t(c1,c2)在哪裏t。c2*2=c3)從值(4)作為年代(c3);1——一個本地引用優先於相關性>選擇(選擇c1從值(1,2,2)作為t(c1,c2,c3)在哪裏t。c2*2=c3)從值(4)作為年代(c3);零——一個明確的標量子查詢相關s.c3>選擇(選擇c1從值(1,2,2)作為t(c1,c2,c3)在哪裏t。c2*2=年代。c3)從值(4)作為年代(c3);1從一個存在謂詞t.c2——相關性>選擇c1從值(1,2)作為T(c1,c2)在哪裏存在(選擇1從值(2)作為年代(c2)在哪裏年代。c2=T。c2);1——嚐試t.c2橫向相關性>選擇c1,c2,c3從值(1,2)作為t(c1,c2),(選擇c3從值(3,4)作為年代(c3,c4)在哪裏c4=c2*2);(UNRESOLVED_COLUMN]”c2”——Successsful使用關鍵詞外側的橫向關聯>選擇c1,c2,c3從值(1,2)作為t(c1,c2),橫向(選擇c3從值(3,4)作為年代(c3,c4)在哪裏c4=c2*2);123——引用一個SQL函數的一個參數>創建或取代臨時函數函數(一個INT)返回INT返回(選擇c1從值(1)作為T(c1)在哪裏c1=一個);>選擇函數(1),函數(2);1零——一個列優先於一個參數>創建或取代臨時函數函數(一個INT)返回INT返回(選擇一個從值(1)作為T(一個)在哪裏t。一個=一個);>選擇函數(1),函數(2);11——符合參數與函數名>創建或取代臨時函數函數(一個INT)返回INT返回(選擇一個從值(1)作為T(一個)在哪裏t。一個=函數。一個);>選擇函數(1),函數(2);1零——橫向別名優先於相關參考>選擇(選擇c2從(選擇1作為c1,c1作為c2)在哪裏c2>5)從值(6)作為t(c1)零——橫向別名優先於函數參數>創建或取代臨時函數函數(xINT)返回表(一個INT,bINT,c雙)返回選擇x+1作為x,x>選擇*從函數(1)22——現在在一起>創建或取代臨時視圖緯度(一個,b)作為值(“lat.a”,“lat.b”);>創建或取代臨時視圖納(一個)作為值(“frm.a”);>創建或取代臨時函數函數(一個INT,bint,cint)返回表返回選擇t。*從緯度,橫向(選擇一個,b,c從納)作為t;>值函數(“func.a”,“func.b”,“func.c”);一個bc- - - - - - - - - - - - - - - - - -納。一個緯度。b函數。c
表和視圖的決議
一個標識符在表引用可以是任何下列之一:
持續的表或視圖在統一目錄或蜂巢Metastore
公共表表達式(CTE)
解決一個標識符取決於是否合格:
合格的
如果標識符是完全限定的三個部分:
catalog.schema.relation
,它是獨一無二的。如果標識符由兩部分組成:
schema.relation
,它的結果做進一步的限定選擇current_catalog ()
讓它獨一無二的。不合格的
公共表表達式
如果引用的範圍內
與
條款,匹配CTE立即從包含標識符與
條款,從那裏向外移動。臨時視圖
任何臨時視圖中定義的標識符匹配當前會話。
保存表
完全由pre-pending符合標識符的結果
選擇current_catalog ()
和選擇current_schema ()
和查一個持久的關係。
如果不能解決任何的關係表,視圖,或CTE,磚了TABLE_OR_VIEW_NOT_FOUND錯誤。
例子
——建立一個場景>使用目錄spark_catalog;>使用模式默認的;>創建表rel(c1int);>插入成rel值(1);rel -一個完全限定的引用:>選擇c1從spark_catalog。默認的。rel;1——一個rel部分合格的參考:>選擇c1從默認的。rel;1rel——一個不合格的參考:>選擇c1從rel;1——添加一個臨時視圖與衝突的名稱:>創建臨時視圖rel(c1)作為值(2);——不合格的臨時視圖優先於持續的引用表:>選擇c1從rel;2——臨時視圖不能合格,所以qualifiecation決心表:>選擇c1從默認的。rel;1——一個不合格的引用公共表表達式贏得甚至超過一個臨時視圖:>與rel(c1)作為(值(3))選擇*從rel;3——如果ct是嵌套的,最近的匹配表引用優先。>與rel(c1)作為(值(3))(與rel(c1)作為(值(4))選擇*從rel);4——解決表而不是CTE的資格:>與rel(c1)作為(值(3))(與rel(c1)作為(值(4))選擇*從默認的。rel);1——一個CTE可見它必須包含查詢>選擇*從(與cte(c1)作為(值(1))選擇1),cte;(TABLE_OR_VIEW_NOT_FOUND]的表或視圖”cte”不能是發現。
函數解析
函數引用被強製拖尾的括號。
它可以解決:
解析函數的名稱取決於是否合格:
合格的
如果名字是完全限定的三個部分:
catalog.schema.function
,它是獨一無二的。如果名稱由兩部分組成:
schema.function
,它的結果做進一步的限定選擇current_catalog ()
讓它獨一無二的。然後目錄中查找函數。
不合格的
對不合格的函數名磚遵循一個固定的優先順序(
路徑
):內裝式函數
如果一個函數,這個名字中存在的內置函數,這個函數是選擇。
臨時函數
如果一個函數的名稱中存在的一組臨時函數,這個函數是選擇。
保存功能
完全限定的函數名pre-pending的結果
選擇current_catalog ()
和選擇current_schema ()
和查持久化功能。
如果函數不能磚提出了一個的解決UNRESOLVED_ROUTINE
錯誤。
例子
>使用目錄spark_catalog;>使用模式默認的;——創建一個具有相同名稱的函數作為一個內置命令>創建函數concat(一個字符串,b字符串)返回字符串返回b| |一個;內裝式CONCAT——不合格的參考解決>選擇concat(“你好”,“世界”);helloworld——合格的引用解析為持久化功能>選擇默認的。concat(“你好”,“世界”);worldhello——創建一個持久的函數>創建函數函數(一個INT,bINT)返回INT返回一個+b;——持續函數解決不合格>選擇函數(4,2);6——創建一個衝突的臨時函數>創建函數函數(一個INT,bINT)返回INT返回一個/b;——臨時函數接受的先例>選擇函數(4,2);2——解決持續的功能現在需要資格>選擇spark_catalog。默認的。函數(4,3);6