Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: Databricks SQL
Databricks Runtime
Ad çözümlemesi, tanımlayıcılarının belirli sütun, alan, parametre veya tablo başvuruları olarak çözümlendiği işlemdir.
Sütun, alan, parametre ve değişken çözünürlüğü
İfadelerdeki tanımlayıcılar aşağıdakilerden herhangi birine başvuru olabilir:
- Sütun adı bir görünüm, tablo, ortak tablo ifadesi (CTE) veya column_alias temelinde.
- Bir yapı veya harita içindeki alan adı veya eşleme anahtarı. Alanlar ve anahtarlar hiçbir zaman niteliksiz olamaz.
- SQL Kullanıcı Tanımlı İşlevinin veya SQL Yordamınınparametre adı.
- oturum veya SQL betiği yerel değişken adı.
-
current_user
veyacurrent_date
gibi,()
kullanımı gerektirmeyen özel bir işlev. - sütun veya değişken değerini varsayılan değerine ayarlamak için
DEFAULT
,INSERT
,UPDATE
veyaMERGE
bağlamında kullanılanSET VARIABLE
anahtar sözcüğü.
Ad çözümlemesi aşağıdaki ilkeleri uygular:
- En yakın eşleşen referans kazanır ve
- Sütunlar ve parametreler alanlar ve anahtarlara kıyasla daha baskındır.
Ayrıntılı olarak, tanımlayıcıların belirli bir başvuruya çözümlenmesi şu kuralları sırayla izler:
Yerel referanslar
Sütun referansı
Eşleştirin tanımlayıcıyı,
FROM clause
'e ait sütun adıyla.Bu tür birden fazla eşleşme varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası verir.
Parametresiz işlev başvurusu
Tanımlayıcı nitelenmemişse ve
current_user
,current_date
veyacurrent_timestamp
ile eşleşiyorsa, bu işlevlerden biri olarak çözümle.Sütun varsayılan belirtimi
Eğer tanımlayıcı nitelenmemişse,
default
ile eşleşir veUPDATE SET
,INSERT VALUES
veyaMERGE WHEN [NOT] MATCHED
bağlamında ifadenin tamamını oluşturuyorsa: O zamanDEFAULT
,INSERT
veyaUPDATE
hedef tablosunun ilgiliMERGE
değeri olarak çözülür.Yapı alanı veya eşleme anahtarı başvurusu
Tanımlayıcı nitelenmişse, aşağıdaki adımlara göre bunu bir alan veya eşleme anahtarıyla eşleştirmeye çabalayın:
A. Son tanımlayıcıyı kaldırın ve bir alan veya anahtar olarak değerlendirin. B. tablosundaki başvurusunu
FROM clause
'nin bir sütunuyla eşleştirin.Bu tür birden fazla eşleşme varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası verir.
Eşleşme varsa ve sütun şöyleyse:
STRUCT
: Alanı eşleştirin.Alan eşleştirilemiyorsa bir FIELD_NOT_FOUND hatası oluşturun.
Birden fazla alan varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası oluşturun.
MAP
: Anahtar uygunsa hataya neden olur.Anahtar haritada gerçekten mevcut değilse bir çalışma zamanı hatası oluşabilir.
Başka bir tür: Hata oluştur. C. Bir alan olarak sondaki tanımlayıcıyı kaldırmak için önceki adımı yineleyin. Sütun olarak yorumlanacak tanımlayıcı kaldığı sürece kuralları (A) ve (B) uygulayın.
Yanal sütun örnekleme hatası
Şunlar için geçerlidir:
Databricks SQL
Databricks Runtime 12.2 LTS ve üzeri
İfade bir
SELECT
listesi içindeyse, bu listesindeki öncekiSELECT
ile baştaki tanımlayıcıyı eşleştirin.Birden fazla eşleşme varsa, bir AMBIGUOUS_LATERAL_COLUMN_ALIAS hatası ver.
Kalan her tanımlayıcıyı bir alan veya harita anahtarı olarak eşleştirin ve eşleştirilemiyorsa FIELD_NOT_FOUND veya AMBIGUOUS_COLUMN_OR_FIELD hatası oluşturun.
Bağıntı
YANAL
Sorgudan önce bir
LATERAL
anahtar sözcüğü varsa, sorguyu içeren veFROM
öncesindekiLATERAL
tablo başvurularını göz önünde bulundurarak 1.a ve 1.d kurallarını uygulayın.Normal
Sorgu bir skaler alt sorgu ise veya
IN
EXISTS
alt sorgu, içeren sorgununFROM
yan tümcesindeki tablo başvurularını dikkate alarak 1.a, 1.d ve 2 kurallarını uygular.
İç içe bağıntı
Sorgunun iç içe geçme düzeyleri boyunca, 3. kuralı tekrar ederek yeniden uygulayın.
[FOR döngüsü](control-flow/for-stmt.md)
deyimi bir
FOR
döngüsünde yer alırsa:A. Tanımlayıcıyı
FOR
döngü deyimi sorgusundaki bir sütunla eşleştirin. Eğer tanımlayıcı nitelikli ise, niteleyici tanımlanmışsa FOR döngüsü değişkeninin adıyla eşleşmelidir. B. Tanımlayıcı nitelenmişse, bir parametrenin alanına veya eşleme anahtarına 1.c kuralına göre eşleştirin.-
Deyimi bir bileşik deyimde yer aldıysa:
A. Tanımlayıcıyı bu bileşik deyimde bildirilen bir değişkenle eşleştirin. Tanımlayıcı nitelenmişse, nitelendirici, tanımlanmışsa bileşik deyimin etiketiyle eşleşmelidir. B. Tanımlayıcı nitelenmişse, kural 1.c uyarınca bir değişkenin alanı veya harita anahtarı ile eşleştirin.
İç içe bileşik deyimi veya
FOR
döngüsüBileşik ifadenin iç içe geçmiş seviyelerinde yinelemeli olarak 5. ve 6. kuralları yeniden uygulayın.
Rutin parametreleri
İfade bir CREATE FUNCTION veya CREATE PROCEDURE deyiminin parçasıysa:
- tanımlayıcıyı parametre adıile eşleştirin. Tanımlayıcı nitelendirilmişse, niteleyici rutin adıyla eşleşmelidir.
- Tanımlayıcı nitelenmişse, bir parametrenin alanına veya eşleme anahtarına 1.c kuralına göre eşleştirin.
Oturum Değişkenleri
- tanımlayıcıyı değişken adıile eşleştirin. Tanımlayıcı uygunsa, niteleyici
session
veyasystem.session
olmalıdır. - Tanımlayıcı nitelenmişse, kural 1.c uyarınca bir değişkenin alanı veya harita anahtarı ile eşleştirin.
- tanımlayıcıyı değişken adıile eşleştirin. Tanımlayıcı uygunsa, niteleyici
Sınırlamalar
Pahalı olabilecek bağıntılı sorguların yürütülmesini önlemek için Azure Databricks, bağıntıyı bir düzeyle sınırlar. Bu kısıtlama, SQL işlevlerindeki parametre başvuruları için de geçerlidir.
Örnekler
-- 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
Tablo ve görünüm çözünürlüğü
tablo başvurusu içindeki bir tanımlayıcı aşağıdakilerden herhangi biri olabilir:
- Unity Kataloğu veya Hive Meta Veri Deposu'nda kalıcı tablo veya görünüm
- Ortak tablo ifadesi (CTE)
- Geçici görünüm
Tanımlayıcının çözümlenmesi, tanımlayıcının uygun olup olmamasına bağlıdır:
Kalifiye
Tanımlayıcı üç bölümle tam olarak nitelenmişse:
catalog.schema.relation
, benzersizdir.Tanımlayıcı iki bölümden oluşuyorsa:
schema.relation
, benzersiz hale getirmek içinSELECT current_catalog()
sonucuyla daha da nitelenmiş olur.Vasıfsız
Ortak tablo ifadesi
Başvuru bir
WITH
yan tümcesi kapsamındaysa, tanımlayıcıyı öncelikle içinde bulunduğuWITH
yan tümcesiyle başlayan ve ardından dışarı doğru ilerleyen bir CTE ile eşleştirin.Geçici görünüm
Tanımlayıcıyı geçerli oturumda tanımlanan herhangi bir geçici görünümle eşleştirin.
Kalıcı tablo
SELECT current_catalog()
veSELECT current_schema()
sonucunu önceden beklemeye alarak tanımlayıcıyı tam olarak niteleyin ve kalıcı bir ilişki olarak arayın.
İlişki herhangi bir tablo, görünüm veya CTE ile çözülemezse Databricks TABLE_OR_VIEW_NOT_FOUND hatası oluşturur.
Örnekler
-- 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.
İşlev çözünürlüğü
İşlev başvurusu, zorunlu sondaki parantez kümesi tarafından tanınır.
Şu çözümlenebilir:
- Azure Databricks tarafından sağlanan yerleşik bir işlev,
- Kapsamı geçerli oturum olarak belirlenmiş geçici bir kullanıcı tanımlı işlev veya
- Hive meta veri deposunda veya Unity Kataloğu'nda depolanan kalıcı bir kullanıcı tanımlı işlev.
İşlev adının çözümlenmesi, nitelenmiş olup olmadığına bağlıdır:
Kalifiye
Ad üç bölümle tam olarak nitelenmişse:
catalog.schema.function
benzersizdir.Ad, iki bölümden oluşuyorsa ve benzersiz hale getirilmek isteniyorsa,
schema.function
sonucuylaSELECT current_catalog()
ile daha da tanımlanır.Ardından işlev katalogda aranılır.
Vasıfsız
Nitelenmemiş işlev adları üzerinde Azure Databricks sabit bir öncelik sırasını izler (
PATH
):Yerleşik işlev
Yerleşik işlevler kümesi arasında bu ada sahip bir işlev varsa, bu işlev seçilir.
Geçici işlev
Geçici işlevler kümesi arasında bu ada sahip bir işlev varsa, bu işlev seçilir.
Kalıcı işlev
SELECT current_catalog()
veSELECT current_schema()
sonucunu önceden beklemeye alarak işlev adını tam olarak niteleyin ve bunu kalıcı bir işlev olarak arayın.
İşlev çözümlenemiyorsa Azure Databricks bir UNRESOLVED_ROUTINE
hata oluşturur.
Örnekler
> 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