Aracılığıyla paylaş


Ad çözümlemesi

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime

Ad çözümlemesi, tanımlayıcıların belirli sütun, alan, parametre veya tablo başvuruları için çö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:

Ad çözümlemesi aşağıdaki ilkeleri uygular:

  • En yakın eşleşen başvuru kazanır ve
  • Sütunlar ve parametre alanlar ve anahtarlar üzerinde kazanır.

Ayrıntılı olarak, tanımlayıcıların belirli bir başvuruya çözümlenmesi şu kuralları sırayla izler:

  1. Yerel başvurular

    1. Sütun başvurusu

      Tanımlayıcıyı ,nitelenmiş olabilecek şekilde, tablo başvurusundaki bir sütun adıyla eşleştirinFROM clause.

      Bu tür birden fazla eşleşme varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası alın.

    2. Parametresiz işlev başvurusu

      Tanımlayıcı nitelenmemişse ve , current_dateveya current_timestamp: ile eşleşiyorsacurrent_user, bu işlevlerden biri olarak çözümle.

    3. Varsayılan sütun belirtimi

      Tanımlayıcı nitelenmemişse, default ifadenin tamamını bir UPDATE SET, INSERT VALUESveya MERGE WHEN [NOT] MATCHEDbağlamında eşleştirir ve oluşturur: veya hedef tablosunun INSERTUPDATEMERGEilgili DEFAULT değeri olarak çözümleyin.

    4. 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. geri kalanını tablo başvurusundaki bir sütunla eşleştirinFROM clause.

      Bu tür birden fazla eşleşme varsa, AMBIGUOUS_COLUMN_OR_FIELD hatası alın.

      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 verme. C. Bir alan olarak sondaki tanımlayıcıyı kaldırmak için önceki adımı yineleyin. Sütun olarak yorumlayabilmek için bir tanımlayıcı kalırken kuralları (A) ve (B) uygulayın.

  2. Yanal sütun diğer adı

    Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 12.2 LTS ve üzeri

    İfade bir SELECT listenin içindeyse, öndeki tanımlayıcıyı bu listedeki önceki bir sütun diğer adıylaSELECT eşleştirin.

    Birden fazla eşleşme varsa, AMBIGUOUS_LATERAL_COLUMN_ALIAS hatası alın.

    Kalan her tanımlayıcıyı bir alan veya eşleme anahtarı olarak eşleştirin ve eşleştirilemiyorsa FIELD_NOT_FOUND veya AMBIGUOUS_COLUMN_OR_FIELD hatası oluşturun.

  3. Bağıntı

    • LATERAL

      Sorgunun önünde bir LATERAL anahtar sözcük varsa, sorguyu içeren ve önünde LATERALbulunan tablo başvurularını FROM göz önünde bulundurarak 1.a ve 1.d kurallarını uygulayın.

    • Normal

      Sorgu bir skaler alt sorgu ise veya INEXISTS alt sorgu, içeren sorgunun FROM yan tümcesindeki tablo başvurularını dikkate alarak 1.a, 1.d ve 2 kurallarını uygular.

  4. İç içe bağıntı

    Sorgunun iç içe geçme düzeyleri üzerinde yineleyen 3. kuralı yeniden uygulayın.

  5. Rutin parametreler

    İfade create FUNCTION deyiminin bir parçasıysa:

    1. Tanımlayıcıyı bir parametre adıyla eşleştirin. Tanımlayıcı nitelenmişse, niteleyici işlevin adıyla eşleşmelidir.
    2. Tanımlayıcı nitelenmişse, 1.c kuralını izleyen bir parametrenin alan veya eşleme anahtarıyla eşleştirin
  6. Değişkenler

    1. Tanımlayıcıyı bir değişken adıyla eşleştirin. Tanımlayıcı nitelenmişse, niteleyici veya system.sessionolmalıdırsession.
    2. Tanımlayıcı nitelenmişse, 1.c kuralını izleyen bir değişkenin alan veya eşleme anahtarıyla eşleştirin

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şvurusundaki bir tanımlayıcı aşağıdakilerden 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:

  • Nitelikli

    Tanımlayıcı üç bölümle tam olarak nitelenmişse: catalog.schema.relationbenzersizdir.

    Tanımlayıcı iki bölümden oluşuyorsa: schema.relation, benzersiz hale getirmek için sonucuyla SELECT current_catalog() daha da nitelenmiş olur.

  • Nitelenmemiş

    1. Ortak tablo ifadesi

      Başvuru bir WITH yan tümce kapsamındaysa, tanımlayıcıyı hemen içeren yan tümcesiyle başlayıp oradan dışarı doğru hareket eden WITH bir CTE ile eşleştirin.

    2. 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.

    3. Kalıcı tablo

      sonucunu SELECT current_catalog() önceden beklemeye alarak tanımlayıcıyı tam olarak niteleyin ve SELECT current_schema() kalıcı bir ilişki olarak arayın.

İlişki herhangi bir tablo, görünüm veya CTE ile çözümlenemiyorsa Databricks bir 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:

İşlev adının çözümlenmesi, nitelenmiş olup olmadığına bağlıdır:

  • Nitelikli

    Ad üç bölümle tam olarak nitelenmişse: catalog.schema.functionbenzersizdir.

    Ad iki bölümden oluşuyorsa: schema.function, benzersiz hale getirmek için sonucuyla SELECT current_catalog() daha da nitelenmiş olur.

    Ardından işlev katalogda aranılır.

  • Nitelenmemiş

    Nitelenmemiş işlev adları için Azure Databricks sabit bir öncelik sırasına (PATH):

    1. Yerleşik işlev

      Yerleşik işlevler kümesi arasında bu ada sahip bir işlev varsa, bu işlev seçilir.

    2. Geçici işlev

      Geçici işlevler kümesi arasında bu ada sahip bir işlev varsa, bu işlev seçilir.

    3. Kalıcı işlev

      sonucunu SELECT current_catalog() önceden beklemeye alarak işlev adını tam olarak niteleyin ve SELECT current_schema() 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