名称解析

适用于:检查标记是的砖的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. 侧列别名

    适用于:检查标记是的砖的SQL检查标记是的砖运行时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