Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Область применения: Databricks SQL
Databricks Runtime
Разрешение имен — это процесс, с помощью которого идентификаторы привязываются к определенным столбцам, полям, параметрам или табличным ссылкам.
Разрешение столбцов, полей, параметров и переменных
Идентификаторы в выражениях могут ссылаться на любой из следующих элементов:
- имя столбца на основе представления, таблицы, общего табличного выражения (CTE) или column_alias.
- Имя поля или ключ карты в структуре или карте. Поля и ключи никогда не могут быть неклассифицированными.
- Имя параметра определяемой пользователем функции SQL.
- Имя локальной переменной для сеанса или скрипта SQL.
- Специальная функция, например
current_user
илиcurrent_date
которая не требует использования()
. - Ключевое слово
DEFAULT
, используемое в контекстеINSERT
,UPDATE
,MERGE
илиSET VARIABLE
, чтобы задать значение столбца или переменной по умолчанию.
Разрешение имен применяет следующие принципы:
- Ближайшая ссылка побеждает в сравнении и
- Столбцы и параметры выигрывают над полями и ключами.
Подробно, разрешение идентификаторов до конкретной ссылки происходит согласно следующим правилам:
Локальные ссылки
Ссылка на столбец
Соотнесите идентификатор, который может быть квалифицирован, с именем столбца в ссылке на таблицу
FROM clause
.Если существует несколько таких совпадений, это вызовет ошибку AMBIGUOUS_COLUMN_OR_FIELD.
Справочник по функции без параметров
Если идентификатор неквалифицированный и соответствует
current_user
,current_date
илиcurrent_timestamp
, рассмотрите его как одну из этих функций.спецификация столбца по умолчанию
Если идентификатор не квалифицирован, соответствует
default
и образует все выражение в контекстеUPDATE SET
,INSERT VALUES
илиMERGE WHEN [NOT] MATCHED
: разрешите его как соответствующееDEFAULT
значение целевой таблицы дляINSERT
,UPDATE
илиMERGE
.Ссылка на поле структуры или ключ карты
Если идентификатор квалифицирован, выполните попытку сопоставить его с полем или ключом карты в соответствии со следующими шагами:
А. Удалите последний идентификатор и обработайте его как поле или ключ. B. Сопоставьте остаток со столбцом в таблице , ссылка из
FROM clause
.Если существует несколько таких совпадений, вызовет ошибку AMBIGUOUS_COLUMN_OR_FIELD .
Если имеется совпадение, и столбец имеет следующий тип:
STRUCT
: соответствует полю.Если поле не удается сопоставить, вызовите ошибку FIELD_NOT_FOUND .
Если существует несколько полей, возникает ошибка AMBIGUOUS_COLUMN_OR_FIELD .
MAP
: возникает ошибка, если ключ квалифицирован.Ошибка времени выполнения может произойти, если ключ на самом деле отсутствует в отображении.
Любой другой тип: вызов ошибки. С. Повторите предыдущий шаг, чтобы удалить конечный идентификатор в виде поля. Примените правила (A) и (B) при наличии идентификатора, оставленного для интерпретации как столбца.
алиасинг бокового столбца
Область применения:
Databricks SQL
Databricks Runtime 12.2 LTS и выше
Если выражение находится в списке
SELECT
, ведущий идентификатор необходимо сопоставить с соответствующим предыдущим псевдонимом столбца в этом спискеSELECT
.Если существует несколько таких совпадений, вызовет ошибку AMBIGUOUS_LATERAL_COLUMN_ALIAS .
Сопоставляйте каждый оставшийся идентификатор как поле или ключ отображения и вызывайте ошибку FIELD_NOT_FOUND или AMBIGUOUS_COLUMN_OR_FIELD, если не удаётся сопоставить.
Корреляция
БОКОВОЙ
Если перед запросом предшествует ключевое слово
LATERAL
, примените правила 1.a и 1.d, учитывая ссылки на таблицы вFROM
, содержащие запрос и предшествующиеLATERAL
.Периодически
Если запрос является скалярным вложенным запросом ,
IN
или вложенным запросомEXISTS
, применять правила 1.a, 1.d и 2, учитывая ссылки на таблицы в предложенииFROM
запроса.
Вложенная корреляция
Повторно примените правило 3 с учетом уровней вложенности запроса.
[цикл FOR](control-flow/for-stmt.md]
Если инструкция содержится в цикле
FOR
:А. Соотнесите идентификатор со столбцом в запросе инструкции цикла
FOR
. Если идентификатор квалифицирован, квалификатор должен соответствовать имени переменной цикла FOR, если она определена. B. Если идентификатор квалифицирован, он должен сопоставляться с полем или ключом карты параметра в соответствии с правилом 1.c-
Если инструкция содержится в составной инструкции:
А. Сопоставьте идентификатор с переменной, объявленной в этом составном выражении. Если идентификатор квалифицирован, квалификатор должен соответствовать метке составного оператора, если она была определена. B. Если идентификатор квалифицирован, сопоставить с полем или ключом отображения переменной согласно правилу 1.c
вложенный составной оператор или цикл
FOR
Повторно примените правила 5 и 6, в процессе итерации по уровням вложенности составного выражения.
параметры рутины
Если выражение является частью инструкции CREATE FUNCTION:
- Сопоставьте идентификатор с именем параметра. Если идентификатор квалифицирован, квалификатор должен соответствовать имени подпрограммы.
- Если идентификатор квалифицирован, он должен сопоставляться с полем или ключом карты параметра в соответствии с правилом 1.c
переменные сеанса
Ограничения
Чтобы предотвратить выполнение потенциально дорогостоящих сопоставленных запросов, Azure Databricks ограничивает поддерживаемую корреляцию на один уровень. Это ограничение также применяется к ссылкам на параметры в функциях SQL.
Примеры
-- Differentiating columns and fields
> SELECT a FROM VALUES(1) AS t(a);
1
> SELECT t.a FROM VALUES(1) AS t(a);
1
> SELECT t.a FROM VALUES(named_struct('a', 1)) AS t(t);
1
-- A column takes precendece over a field
> SELECT t.a FROM VALUES(named_struct('a', 1), 2) AS t(t, a);
2
-- Implict lateral column alias
> SELECT c1 AS a, a + c1 FROM VALUES(2) AS T(c1);
2 4
-- A local column reference takes precedence, over a lateral column alias
> SELECT c1 AS a, a + c1 FROM VALUES(2, 3) AS T(c1, a);
2 5
-- A scalar subquery correlation to S.c3
> SELECT (SELECT c1 FROM VALUES(1, 2) AS t(c1, c2)
WHERE t.c2 * 2 = c3)
FROM VALUES(4) AS s(c3);
1
-- A local reference takes precedence over correlation
> SELECT (SELECT c1 FROM VALUES(1, 2, 2) AS t(c1, c2, c3)
WHERE t.c2 * 2 = c3)
FROM VALUES(4) AS s(c3);
NULL
-- An explicit scalar subquery correlation to s.c3
> SELECT (SELECT c1 FROM VALUES(1, 2, 2) AS t(c1, c2, c3)
WHERE t.c2 * 2 = s.c3)
FROM VALUES(4) AS s(c3);
1
-- Correlation from an EXISTS predicate to t.c2
> SELECT c1 FROM VALUES(1, 2) AS T(c1, c2)
WHERE EXISTS(SELECT 1 FROM VALUES(2) AS S(c2)
WHERE S.c2 = T.c2);
1
-- Attempt a lateral correlation to t.c2
> SELECT c1, c2, c3
FROM VALUES(1, 2) AS t(c1, c2),
(SELECT c3 FROM VALUES(3, 4) AS s(c3, c4)
WHERE c4 = c2 * 2);
[UNRESOLVED_COLUMN] `c2`
-- Successsful usage of lateral correlation with keyword LATERAL
> SELECT c1, c2, c3
FROM VALUES(1, 2) AS t(c1, c2),
LATERAL(SELECT c3 FROM VALUES(3, 4) AS s(c3, c4)
WHERE c4 = c2 * 2);
1 2 3
-- Referencing a parameter of a SQL function
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
RETURN (SELECT c1 FROM VALUES(1) AS T(c1) WHERE c1 = a);
> SELECT func(1), func(2);
1 NULL
-- A column takes precedence over a parameter
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
RETURN (SELECT a FROM VALUES(1) AS T(a) WHERE t.a = a);
> SELECT func(1), func(2);
1 1
-- Qualify the parameter with the function name
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT) RETURNS INT
RETURN (SELECT a FROM VALUES(1) AS T(a) WHERE t.a = func.a);
> SELECT func(1), func(2);
1 NULL
-- Lateral alias takes precedence over correlated reference
> SELECT (SELECT c2 FROM (SELECT 1 AS c1, c1 AS c2) WHERE c2 > 5)
FROM VALUES(6) AS t(c1)
NULL
-- Lateral alias takes precedence over function parameters
> CREATE OR REPLACE TEMPORARY FUNCTION func(x INT)
RETURNS TABLE (a INT, b INT, c DOUBLE)
RETURN SELECT x + 1 AS x, x
> SELECT * FROM func(1)
2 2
-- All together now
> CREATE OR REPLACE TEMPORARY VIEW lat(a, b) AS VALUES('lat.a', 'lat.b');
> CREATE OR REPLACE TEMPORARY VIEW frm(a) AS VALUES('frm.a');
> CREATE OR REPLACE TEMPORARY FUNCTION func(a INT, b int, c int)
RETURNS TABLE
RETURN SELECT t.*
FROM lat,
LATERAL(SELECT a, b, c
FROM frm) AS t;
> VALUES func('func.a', 'func.b', 'func.c');
a b c
----- ----- ------
frm.a lat.b func.c
Разрешение таблиц и представлений
Идентификатор в ссылке на таблицу может быть одним из следующих:
- Постоянная таблица или представление в каталоге Unity или хранилище метаданных Hive
- Общее табличное выражение (CTE)
- Временное представление
Определение идентификатора зависит от того, квалифицирован ли он:
Квалифицирован
Если идентификатор полностью квалифицирован и состоит из трёх частей:
catalog.schema.relation
, он является уникальным.Если идентификатор состоит из двух частей:
schema.relation
, он дополнительно квалифицируется с результатомSELECT current_catalog()
, чтобы сделать его уникальным.Неквалифицированный
общее табличное выражение
Если ссылка находится в области предложения
WITH
, совместите идентификатор с CTE, начиная с предложенияWITH
, непосредственно содержащего его, и затем расширяя область поиска.Временное представление
Сопоставляйте идентификатор с любым временным представлением, определенным в текущем сеансе.
постоянная таблица
Полное определение идентификатора путем предварительного ожидания результата
SELECT current_catalog()
иSELECT current_schema()
и поиска его в качестве постоянного отношения.
Если отношение не может быть разрешено ни к одной таблице, представлению или CTE, Databricks выдаёт ошибку TABLE_OR_VIEW_NOT_FOUND.
Примеры
-- Setting up a scenario
> USE CATALOG spark_catalog;
> USE SCHEMA default;
> CREATE TABLE rel(c1 int);
> INSERT INTO rel VALUES(1);
-- An fully qualified reference to rel:
> SELECT c1 FROM spark_catalog.default.rel;
1
-- A partially qualified reference to rel:
> SELECT c1 FROM default.rel;
1
-- An unqualified reference to rel:
> SELECT c1 FROM rel;
1
-- Add a temporary view with a conflicting name:
> CREATE TEMPORARY VIEW rel(c1) AS VALUES(2);
-- For unqualified references the temporary view takes precedence over the persisted table:
> SELECT c1 FROM rel;
2
-- Temporary views cannot be qualified, so qualifiecation resolved to the table:
> SELECT c1 FROM default.rel;
1
-- An unqualified reference to a common table expression wins even over a temporary view:
> WITH rel(c1) AS (VALUES(3))
SELECT * FROM rel;
3
-- If CTEs are nested, the match nearest to the table reference takes precedence.
> WITH rel(c1) AS (VALUES(3))
(WITH rel(c1) AS (VALUES(4))
SELECT * FROM rel);
4
-- To resolve the table instead of the CTE, qualify it:
> WITH rel(c1) AS (VALUES(3))
(WITH rel(c1) AS (VALUES(4))
SELECT * FROM default.rel);
1
-- For a CTE to be visible it must contain the query
> SELECT * FROM (WITH cte(c1) AS (VALUES(1))
SELECT 1),
cte;
[TABLE_OR_VIEW_NOT_FOUND] The table or view `cte` cannot be found.
Определение функций
Ссылка на функцию определяется обязательным набором круглых скобок в конце.
Это может привести к:
- Встроенная функция, предоставляемая Azure Databricks,
- Временная определяемая пользователем функция , ограниченная текущим сеансом или
- Постоянная определяемая пользователем функция, хранящуюся в хранилище метаданных hive или каталоге Unity.
Разрешение имени функции зависит от того, квалифицировано ли оно.
Квалифицирован
Если имя полностью квалифицировано тремя элементами:
catalog.schema.function
, это уникально.Если имя состоит из двух частей:
schema.function
, оно дополнительно уточняется с помощью результатаSELECT current_catalog()
для обеспечения его уникальности.Затем функция ищется в каталоге.
Неквалифицированный
Для неквалифицированных имен функций Azure Databricks придерживается устойчивого порядка приоритета (
PATH
).Встроенная функция
Если функция по этому имени существует среди набора встроенных функций, эта функция выбирается.
Временная функция
Если функция по этому имени существует среди набора временных функций, эта функция выбирается.
Сохраняемая функция
Полное определение имени функции путем предварительного ожидания результата
SELECT current_catalog()
иSELECT current_schema()
и поиска его в качестве постоянной функции.
Если не удается разрешить функцию Azure Databricks, возникает UNRESOLVED_ROUTINE
ошибка.
Примеры
> USE CATALOG spark_catalog;
> USE SCHEMA default;
-- Create a function with the same name as a builtin
> CREATE FUNCTION concat(a STRING, b STRING) RETURNS STRING
RETURN b || a;
-- unqualified reference resolves to the builtin CONCAT
> SELECT concat('hello', 'world');
helloworld
-- Qualified reference resolves to the persistent function
> SELECT default.concat('hello', 'world');
worldhello
-- Create a persistent function
> CREATE FUNCTION func(a INT, b INT) RETURNS INT
RETURN a + b;
-- The persistent function is resolved without qualifying it
> SELECT func(4, 2);
6
-- Create a conflicting temporary function
> CREATE FUNCTION func(a INT, b INT) RETURNS INT
RETURN a / b;
-- The temporary function takes precedent
> SELECT func(4, 2);
2
-- To resolve the persistent function it now needs qualification
> SELECT spark_catalog.default.func(4, 3);
6
Связанные статьи
- CREATE FUNCTION (SQL и Python)
- Выражение SQL
- Идентификаторы
- Имена
- ссылка на таблицу
- Запрос