名称解析
适用于:砖的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