Névfeloldás
A következőkre vonatkozik: Databricks SQL Databricks Runtime
A névfeloldás az a folyamat, amellyel az azonosítók adott oszlop-, mező-, paraméter- vagy táblahivatkozásokra lesznek feloldva.
Oszlop, mező, paraméter és változófelbontás
A kifejezések azonosítói az alábbiak bármelyikére hivatkozhatnak:
- Oszlopnév nézet, táblázat, közös táblakifejezés (CTE) vagy column_alias alapján.
- Mezőnév vagy térképkulcs egy struccban vagy térképen belül. A mezők és kulcsok soha nem minősíthetők.
- Felhasználó által definiált SQL-függvény paraméterneve.
- Változó neve.
- Egy speciális függvény, például
current_user
current_date
vagy amely nem követeli()
meg a használatát. - Az
DEFAULT
a kulcsszó, amely a , ,UPDATE
,MERGE
SET VARIABLE
vagy egy oszlop vagy változó értékénekINSERT
alapértelmezett értékére van állítva.
A névfeloldás a következő alapelveket alkalmazza:
- A legközelebbi egyező hivatkozás nyer, és
- Oszlopok és paraméterek nyernek a mezők és kulcsok felett.
Az azonosítók egy adott hivatkozásra történő feloldása a következő szabályok szerint történik:
Helyi hivatkozások
Oszlophivatkozás
Egyezzen a minősíthető azonosítóval a tábla hivatkozásában
FROM clause
szereplő oszlopnévvel.Ha egynél több ilyen egyezés van, AMBIGUOUS_COLUMN_OR_FIELD hibát jelez.
Paraméter nélküli függvényhivatkozás
Ha az azonosító nem minősített, és megegyezik
current_user
,current_date
vagycurrent_timestamp
: Oldja fel a függvények egyikeként.Oszlop ALAPÉRTELMEZETT specifikációja
Ha az azonosító nem minősített, egyezik
default
a teljes kifejezésselUPDATE SET
egy ,INSERT VALUES
vagyMERGE WHEN [NOT] MATCHED
: Feloldás a céltáblaINSERT
megfelelőDEFAULT
értékeként az ,UPDATE
vagyMERGE
.Strukturálási mező vagy térképkulcs referenciája
Ha az azonosító minősített, az alábbi lépéseknek megfelelően törekedjen egy mező vagy térképkulcs egyeztetésére:
V. Távolítsa el az utolsó azonosítót, és kezelje mezőként vagy kulcsként. B. A fennmaradó rész egy oszlophoz való egyeztetése a táblahivatkozásban.
FROM clause
Ha egynél több ilyen egyezés van, AMBIGUOUS_COLUMN_OR_FIELD hibát jelez.
Ha van egyezés, és az oszlop a következő:
STRUCT
: Egyezzen a mezővel.Ha a mező nem feleltethető meg, FIELD_NOT_FOUND hibát jelez.
Ha egynél több mező van, AMBIGUOUS_COLUMN_OR_FIELD hibát jelez.
MAP
: Hibajelzés, ha a kulcs minősített.Futásidejű hiba akkor fordulhat elő, ha a kulcs valójában nem szerepel a térképen.
Bármilyen más típus: Hiba felmerülése. C. Ismételje meg az előző lépést a záró azonosító mezőként való eltávolításához. Alkalmazza a szabályokat (A) és (B), amíg van egy azonosító, amelyet oszlopként kell értelmezni.
Oldalirányú oszlop aliasolása
A következőkre vonatkozik: Databricks SQL Databricks Runtime 12.2 LTS és újabb
Ha a kifejezés egy
SELECT
listában található, egyezzen a vezető azonosítóval egyező oszlop aliasával aSELECT
listában.Ha egynél több ilyen egyezés van, AMBIGUOUS_LATERAL_COLUMN_ALIAS hibát jelez.
Egyezzen meg minden fennmaradó azonosítóval mezőként vagy térképkulcsként, és FIELD_NOT_FOUND vagy AMBIGUOUS_COLUMN_OR_FIELD hibát jelez, ha nem lehet őket egyeztetni.
Korrelációs
OLDALSÓ
Ha a lekérdezést egy
LATERAL
kulcsszó előzi meg, alkalmazza az 1.a és az 1.d szabályt, figyelembe véve a lekérdezést tartalmazó és a lekérdezést megelőzőLATERAL
táblahivatkozásokatFROM
.Rendszeres
Ha a lekérdezés skaláris alquery,
IN
akkorEXISTS
az 1.a, 1.d és 2 szabályt alkalmazza, figyelembe véve a táblahivatkozásokat a lekérdezésFROM
záradékában.
Beágyazott korreláció
Alkalmazza újra a 3. szabályt a lekérdezés beágyazási szintjein.
Rutinparaméterek
Ha a kifejezés egy CREATE FÜGGVÉNY utasítás része:
- Egyezzen az azonosítóval egy paraméternévvel. Ha az azonosító minősített, a minősítőnek meg kell egyeznie a függvény nevével.
- Ha az azonosító minősített, egyeznie kell egy paraméter mező- vagy térképkulcsával az 1.c szabályt követve
Változók
- Egyezzen az azonosítóval egy változónévvel. Ha az azonosító minősített, a minősítőnek
session
vagysystem.session
. - Ha az azonosító minősített, az 1.c szabályt követő változó mező- vagy térképkulcsának felel meg
- Egyezzen az azonosítóval egy változónévvel. Ha az azonosító minősített, a minősítőnek
Korlátozások
A potenciálisan költséges korrelált lekérdezések végrehajtásának megakadályozása érdekében az Azure Databricks egy szintre korlátozza a támogatott korrelációt. Ez a korlátozás az SQL-függvények paraméterhivatkozásaira is vonatkozik.
Példák
-- 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
Táblázat- és nézetfeloldás
A táblahivatkozásban szereplő azonosító az alábbiak bármelyike lehet:
- Állandó tábla vagy nézet a Unity Katalógusban vagy a Hive Metastore-ban
- Gyakori táblakifejezés (CTE)
- Ideiglenes nézet
Az azonosító feloldása attól függ, hogy minősített-e:
Minősített
Ha az azonosító három részből áll:
catalog.schema.relation
egyedi.Ha az azonosító két részből áll:
schema.relation
akkor az egyedivé tétele továbbiSELECT current_catalog()
minősítést eredményez.Képzetlen
Gyakori táblakifejezés
Ha a hivatkozás egy
WITH
záradék hatókörébe tartozik, egyezzen az azonosítóval egy CTE-vel, kezdve az azonnal tartalmazóWITH
záradékkal, és onnan haladjon kifelé.Ideiglenes nézet
Egyezzen az azonosítóval az aktuális munkamenetben definiált bármely ideiglenes nézethez.
Megőrzött tábla
Az azonosító teljes minősítéséhez előre függőben kell lennie az eredménynek
SELECT current_catalog()
, ésSELECT current_schema()
állandó kapcsolatként kell keresnie.
Ha a reláció nem oldható fel egyetlen táblához, nézethez vagy CTE-hez sem, a Databricks TABLE_OR_VIEW_NOT_FOUND hibát jelez.
Példák
-- 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.
Függvényfeloldás
A függvényhivatkozásokat a zárójelek kötelező záró készlete ismeri fel.
Az alábbiakat oldhatja fel:
- Az Azure Databricks által biztosított beépített függvény ,
- Az aktuális munkamenetre hatókörrel rendelkező ideiglenes felhasználó által definiált függvény , vagy
- Egy állandó felhasználó által definiált függvény, amely a hive metaadattárban vagy a Unity-katalógusban van tárolva.
A függvénynevek feloldása attól függ, hogy minősített-e:
Minősített
Ha a név három részből áll:
catalog.schema.function
egyedi.Ha a név két részből áll:
schema.function
akkor az egyedivé tétele továbbiSELECT current_catalog()
minősítést eredményez.A függvény ezután fel lesz keresve a katalógusban.
Képzetlen
A nem minősített függvénynevek esetében az Azure Databricks egy rögzített sorrendet követ(
PATH
):Beépített függvény
Ha egy ilyen nevű függvény létezik a beépített függvények halmaza között, akkor ezt a függvényt választja ki.
Ideiglenes függvény
Ha egy ilyen nevű függvény szerepel az ideiglenes függvények halmazában, akkor a függvény lesz kiválasztva.
Megőrzött függvény
Teljes mértékben minősítse a függvény nevét az eredmény előzetes függőben történő függőben történő függőben való
SELECT current_catalog()
használatával, ésSELECT current_schema()
keresse meg állandó függvényként.
Ha a függvény nem oldható meg, az Azure Databricks hibát jelez UNRESOLVED_ROUTINE
.
Példák
> 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