Překlad adres IP
Platí pro: Databricks SQL
Databricks Runtime
Překlad názvů je proces, pomocí kterého se identifikátory překládají na konkrétní sloupec, pole, parametr nebo odkazy na tabulky.
Sloupec, pole, parametr a rozlišení proměnných
Identifikátory ve výrazech můžou být odkazy na některou z následujících možností:
- Název sloupce založený na zobrazení, tabulce, společném výrazu tabulky (CTE) nebo column_alias.
- Název pole nebo klíč mapování v rámci struktury nebo mapy. Pole a klíče nemohou být nikdy nekvalifikovány.
- Název parametru uživatelem definované funkce SQL
- Název proměnné.
- Zvláštní funkce, jako
current_user
je nebocurrent_date
která nevyžaduje použití()
. - Klíčové
DEFAULT
slovo, které se používá v kontextuINSERT
,UPDATE
,MERGE
neboSET VARIABLE
k nastavení sloupce nebo proměnné hodnoty na výchozí.
Překlad názvů používá následující principy:
- Nejbližší odpovídající odkaz vyhrává a
- Sloupce a parametr vyhrávají nad poli a klíči.
Rozlišení identifikátorů na konkrétní odkaz se podrobně řídí těmito pravidly v pořadí:
Místní odkazy
Odkaz na sloupec
Porovná identifikátor, který může být kvalifikovaný, s názvem sloupce v odkazu na
FROM clause
tabulku .Pokud existuje více takových shod, vyvoláte AMBIGUOUS_COLUMN_OR_FIELD chybu.
Referenční informace k funkcím bez parametrů
Pokud je identifikátor nekvalifikovaný a odpovídá
current_user
,current_date
nebocurrent_timestamp
: Přeložte ho jako jednu z těchto funkcí.Specifikace DEFAULT sloupce
Pokud je identifikátor nekvalifikovaný, odpovídá
default
a tvoří celý výraz v kontextu objektuUPDATE SET
,INSERT VALUES
neboMERGE WHEN [NOT] MATCHED
: Vyřešit jako odpovídajícíDEFAULT
hodnotu cílové tabulkyINSERT
UPDATE
neboMERGE
.Odkaz na pole struktury nebo mapovací klíč
Pokud je identifikátor kvalifikovaný, snažte se ho spárovat s polem nebo mapovacím klíčem podle následujících kroků:
A. Odeberte poslední identifikátor a zacházíte s ním jako s polem nebo klíčem. B. Porovná zbytek se sloupcem v odkazu na
FROM clause
tabulku .Pokud existuje více takových shod, vyvoláte AMBIGUOUS_COLUMN_OR_FIELD chybu.
Pokud existuje shoda a sloupec je následující:
STRUCT
: Porovná pole.Pokud pole nelze spárovat, vytvořte FIELD_NOT_FOUND chybu.
Pokud existuje více než jedno pole, vytvořte AMBIGUOUS_COLUMN_OR_FIELD chybu.
MAP
: Vyvolání chyby, pokud je klíč kvalifikovaný.K eroru modulu runtime může dojít, pokud klíč ve skutečnosti není v mapě.
Jakýkoli jiný typ: Vyvolání chyby C. Opakováním předchozího kroku odeberte koncový identifikátor jako pole. Použijte pravidla (A) a (B), zatímco existuje identifikátor, který se má interpretovat jako sloupec.
Aliasy laterálních sloupců
Platí pro:
Databricks SQL
Databricks Runtime 12.2 LTS a vyšší
Pokud je výraz v
SELECT
seznamu, shodujte počáteční identifikátor s předchozím aliasem sloupce v danémSELECT
seznamu.Pokud existuje více takových shod, vyvolá se AMBIGUOUS_LATERAL_COLUMN_ALIAS chyba.
Porovná každý zbývající identifikátor jako pole nebo klíč mapy a vyvolá FIELD_NOT_FOUND nebo AMBIGUOUS_COLUMN_OR_FIELD chybu, pokud se neshodují.
Korelace
BOČNÍ
Pokud před dotazem
LATERAL
předchází klíčové slovo, použijte pravidla 1.a a 1.d s ohledem na odkazy na tabulku vFROM
obsahujícím dotazu a předLATERAL
.Řádné
Pokud je dotaz skalární poddotaz,
IN
neboEXISTS
poddotaz použijte pravidla 1.a, 1.d a 2 s ohledem na odkazy na tabulku v klauzuli obsahující dotazFROM
.
Vnořená korelace
Opakované použití pravidla 3 iterace nad úrovněmi vnoření dotazu.
Rutinní parametry
Pokud je výraz součástí příkazu CREATE FUNCTION:
- Porovná identifikátor s názvem parametru. Pokud je identifikátor kvalifikovaný, musí kvalifikátor odpovídat názvu funkce.
- Pokud je identifikátor kvalifikovaný, shodujte s polem nebo mapovým klíčem parametru podle pravidla 1.c.
Proměnné
- Porovná identifikátor s názvem proměnné. Pokud je identifikátor kvalifikovaný, musí být
session
kvalifikátor nebosystem.session
. - Pokud je identifikátor kvalifikovaný, shodujte s polem nebo mapovým klíčem proměnné podle pravidla 1.c.
- Porovná identifikátor s názvem proměnné. Pokud je identifikátor kvalifikovaný, musí být
Omezení
Aby se zabránilo spuštění potenciálně drahých korelovaných dotazů, Azure Databricks omezuje podporovanou korelaci na jednu úroveň. Toto omezení platí také pro odkazy na parametry ve funkcích SQL.
Příklady
-- 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
Rozlišení tabulky a zobrazení
Identifikátor v tabulce může být některý z následujících:
- Trvalá tabulka nebo zobrazení v katalogu Unity nebo metastoru Hive
- Common table expression (CTE)
- Dočasné zobrazení
Řešení identifikátoru závisí na tom, jestli je kvalifikovaný:
Kvalifikovaný
Pokud je identifikátor plně kvalifikovaný se třemi částmi:
catalog.schema.relation
je jedinečný.Pokud se identifikátor skládá ze dvou částí:
schema.relation
je dále kvalifikovaný s výsledkemSELECT current_catalog()
, aby byl jedinečný.Nekvalifikovaný
Běžný výraz tabulky
Pokud je odkaz v rozsahu
WITH
klauzule, shodujte identifikátor s CTE, který začíná okamžitě obsahujícíWITH
klauzulí a přechází směrem odsud.Dočasné zobrazení
Porovná identifikátor s jakýmkoli dočasným zobrazením definovaným v aktuální relaci.
Trvalá tabulka
Plně kvalifikujte identifikátor před čekáním na výsledek
SELECT current_catalog()
aSELECT current_schema()
vyhledejte ho jako trvalý vztah.
Pokud se relace nedá přeložit na žádnou tabulku, zobrazení nebo CTE, Databricks vyvolá chybu TABLE_OR_VIEW_NOT_FOUND .
Příklady
-- 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.
Rozlišení funkce
Odkaz na funkci je rozpoznán povinnou koncovou sadou závorek.
Může se vyřešit na:
- Integrovaná funkce poskytovaná službou Azure Databricks
- Dočasná uživatelem definovaná funkce vymezená na aktuální relaci nebo
- Trvalá uživatelem definovaná funkce uložená v metastoru Hive nebo v katalogu Unity.
Překlad názvu funkce závisí na tom, jestli je kvalifikovaný:
Kvalifikovaný
Pokud je název plně kvalifikovaný se třemi částmi:
catalog.schema.function
je jedinečný.Pokud se název skládá ze dvou částí:
schema.function
je dále kvalifikovaný s výsledkemSELECT current_catalog()
, aby byl jedinečný.Funkce se pak vyhledá v katalogu.
Nekvalifikovaný
Pro nekvalifikované názvy funkcí Azure Databricks se řídí pevným pořadím priority (
PATH
):Integrovaná funkce
Pokud funkce podle tohoto názvu existuje mezi sadou předdefinovaných funkcí, vybere se tato funkce.
Dočasná funkce
Pokud funkce podle tohoto názvu existuje mezi sadou dočasných funkcí, vybere se tato funkce.
Trvalá funkce
Plně kvalifikujte název funkce předem čekajícími na výsledek
SELECT current_catalog()
aSELECT current_schema()
vyhledejte ho jako trvalou funkci.
Pokud funkci nejde vyřešit, Azure Databricks vyvolá UNRESOLVED_ROUTINE
chybu.
Příklady
> 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
Související články
-
(SQL a Python) - Výraz SQL
- Identifikátory
- Jména
- Referenční informace k tabulce
- Dotaz