名稱解析

適用於:檢查標記是的磚的SQL檢查標記是的磚運行時

名稱解析的過程標識符解決特定列、字段、參數,或表引用。

列、字段和參數分辨率

標識符在表達式可以引用任何下列之一:

  • 列名基於一個視圖、表公共表表達式(CTE),或一個column_alias

  • 字段名地圖中的關鍵結構體或地圖。字段和密鑰永遠不可能不合格。

  • 參數名稱SQL用戶定義函數

  • 一個特殊的函數等current_user當前日期不需要使用哪一個()

  • 默認的關鍵字的上下文中使用插入,更新,合並設置默認的列值。

名稱解析應用以下原則:

  • 最親密的匹配參考獲勝,和

  • 列和參數戰勝字段和鑰匙。

在細節,解決標識一個特定的參考遵循這些規則為:

  1. 本地引用

    1. 列引用

      匹配的標識符,這可能是合格的,一個列名表引用條款

      如果有不止一個這樣的匹配,提高了AMBIGUOUS_COLUMN_OR_FIELD錯誤。

    2. 無參數的函數引用

      如果不合格的標識符和匹配current_user,當前日期,或current_timestamp:解決這些功能之一。

    3. 列默認規範

      如果標識符是不合格的,比賽默認的占整個表達式的上下文更新,插入,或合並(不)匹配:解決各自的默認的目標表的價值插入,更新合並

    4. 結構體字段或地圖的關鍵參考

      如果標識符是合格的,那麼努力匹配字段或地圖主要根據以下步驟:

      1. 刪除最後一個標識符,並把它作為一個領域或關鍵。

      2. 比賽剩下的一列表引用條款

        如果有不止一個這樣的匹配,提高了AMBIGUOUS_COLUMN_OR_FIELD錯誤。

        如果匹配列是:

        • 結構體:匹配字段。

          如果現場不能匹配,提高FIELD_NOT_FOUND錯誤。

          如果有多個領域,提高AMBIGUOUS_COLUMN_OR_FIELD錯誤。

        • 地圖:報錯關鍵是合格的。

          一個運行時可能發生eror如果鍵實際上並不是出現在地圖上。

        • 其他類型:提高一個錯誤。

      3. 重複前麵的步驟刪除標識符作為一個領域。應用規則(A)和(B)雖然有一個標識符左列來解釋。

  2. 側列別名

    適用於:檢查標記是的磚運行時12.2及以上

    如果表達式是在一個選擇列表,匹配的主要標識符前列別名在那選擇列表。

    如果有不止一個這樣的匹配,提高了AMBIGUOUS_LATERAL_COLUMN_ALIAS錯誤。

    地圖匹配每個剩餘的標識符作為一個字段或鍵,和提高FIELD_NOT_FOUNDAMBIGUOUS_COLUMN_OR_FIELD如果他們不能匹配錯誤。

  3. 相關

    • 橫向

      如果查詢是之前橫向關鍵字,應用規則1。和1。d考慮表引用的包含查詢和前橫向

    • 常規的

      如果查詢是一個標量子查詢,,或存在子查詢應用規則1。,1。d和2考慮包含查詢中的表引用的條款。

  4. 嵌套關係

    重新應用規則3遍曆查詢的嵌套級別。

  5. 常規參數

    如果表達式的一部分創建函數聲明:

    1. 匹配的標識符參數名稱。如果標識符是合格的,限定符的名稱必須匹配函數。

    2. 如果標識符是合格的,匹配的字段或地圖的關鍵參數後規則1.攝氏度

限製

為了防止執行潛在昂貴的相關查詢,磚限製支持關聯一個級別。這種限製也適用於在SQL函數參數的引用。

例子

——區分列和字段>選擇一個(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)在哪裏tc2*2=c3)(4)作為年代(c3);1——一個本地引用優先於相關性>選擇(選擇c1(1,2,2)作為t(c1,c2,c3)在哪裏tc2*2=c3)(4)作為年代(c3);——一個明確的標量子查詢相關s.c3>選擇(選擇c1(1,2,2)作為t(c1,c2,c3)在哪裏tc2*2=年代c3)(4)作為年代(c3);1從一個存在謂詞t.c2——相關性>選擇c1(1,2)作為T(c1,c2)在哪裏存在(選擇1(2)作為年代(c2)在哪裏年代c2=Tc2);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 ()讓它獨一無二的。

  • 不合格的

    1. 公共表表達式

      如果引用的範圍內條款,匹配CTE立即從包含標識符條款,從那裏向外移動。

    2. 臨時視圖

      任何臨時視圖中定義的標識符匹配當前會話。

    3. 保存表

      完全由pre-pending符合標識符的結果選擇current_catalog ()選擇current_schema ()和查一個持久的關係。

如果不能解決任何的關係表,視圖,或CTE,磚了TABLE_OR_VIEW_NOT_FOUND錯誤。

例子

——建立一個場景>使用目錄spark_catalog;>使用模式默認的;>創建rel(c1int);>插入rel(1);rel -一個完全限定的引用:>選擇c1spark_catalog默認的rel;1——一個rel部分合格的參考:>選擇c1默認的rel;1rel——一個不合格的參考:>選擇c1rel;1——添加一個臨時視圖與衝突的名稱:>創建臨時視圖rel(c1)作為(2);——不合格的臨時視圖優先於持續的引用表:>選擇c1rel;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不能發現

函數解析

函數引用被強製拖尾的括號。

它可以解決:

  • 一個內裝式函數提供的磚,

  • 一個臨時的用戶定義函數當前會話作用域,或者

  • 持久的用戶定義函數存儲在蜂巢metastore或統一目錄。

解析函數的名稱取決於是否合格:

  • 合格的

    如果名字是完全限定的三個部分:catalog.schema.function,它是獨一無二的。

    如果名稱由兩部分組成:schema.function,它的結果做進一步的限定選擇current_catalog ()讓它獨一無二的。

    然後目錄中查找函數。

  • 不合格的

    對不合格的函數名磚遵循一個固定的優先順序(路徑):

    1. 內裝式函數

      如果一個函數,這個名字中存在的內置函數,這個函數是選擇。

    2. 臨時函數

      如果一個函數的名稱中存在的一組臨時函數,這個函數是選擇。

    3. 保存功能

      完全限定的函數名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