Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:
Databricks SQL
Databricks Runtime
Resolusi nama adalah proses di mana pengidentifikasi dihubungkan dengan referensi kolom, bidang, parameter, atau tabel tertentu.
Resolusi kolom, bidang, parameter, dan variabel
Pengidentifikasi dalam ekspresi dapat menjadi referensi ke salah satu hal berikut:
- Nama kolom berdasarkan tampilan, tabel, ekspresi tabel umum (CTE), atau column_alias.
- Nama bidang atau kunci peta dalam struktur atau peta. Bidang dan kunci harus selalu memenuhi kualifikasi.
- Nama parameterFungsi yang Ditentukan Pengguna SQL atau Prosedur SQL.
- Nama variabel lokal sesi atau skrip SQL .
- Fungsi khusus seperti
current_userataucurrent_dateyang tidak memerlukan penggunaan(). - Kata kunci
DEFAULTyang digunakan dalam konteksINSERT,UPDATE,MERGE, atauSET VARIABLEuntuk mengatur kolom atau nilai variabel ke defaultnya.
Resolusi nama menerapkan prinsip-prinsip berikut:
- Referensi pencocokan terdekat menang, dan
- Kolom dan parameter mengalahkan bidang dan kunci.
Secara rinci, pemetaan pengidentifikasi ke referensi tertentu mengikuti aturan ini secara berurutan.
Referensi lokal
referensi Kolom
Cocokkan pengidentifikasi, yang mungkin ditentukan secara khusus, dengan nama kolom dalam referensi tabel dari
FROM clause.Jika ada lebih dari satu kecocokan tersebut, munculkan kesalahan AMBIGUOUS_COLUMN_OR_FIELD.
Referensi fungsi tanpa parameter
Jika pengidentifikasi tidak memenuhi syarat dan cocok dengan
current_user,current_date, ataucurrent_timestamp: Selesaikan sebagai salah satu fungsi ini.DEFAULT spesifikasi Kolom
Jika pengenal tidak berkualifikasi, sesuai dengan
defaultdan membentuk seluruh ekspresi dalam konteksUPDATE SET,INSERT VALUES, atauMERGE WHEN [NOT] MATCHED: Tentukan sebagai nilaiDEFAULTyang sesuai dari tabel targetINSERT,UPDATE, atauMERGE.Referensi bidang struktur atau kunci peta
Jika pengidentifikasi memenuhi syarat, upayakan untuk mencocokkannya dengan bidang atau kunci peta sesuai dengan langkah-langkah berikut:
Sebuah. Hapus pengidentifikasi terakhir dan perlakukan sebagai bidang atau kunci. B. Cocokkan hasil pembagian yang tersisa dengan kolom dalam referensi tabel dari
FROM clause.Jika ada lebih dari satu kecocokan tersebut, munculkan kesalahan AMBIGUOUS_COLUMN_OR_FIELD.
Jika ada kecocokan dan kolomnya adalah:
STRUCT: Sesuaikan kolom.Jika bidang tidak dapat dicocokkan, tampilkan error FIELD_NOT_FOUND.
Jika ada lebih dari satu bidang, timbulkan kesalahan AMBIGUOUS_COLUMN_OR_FIELD.
MAP: Munculkan kesalahan jika kunci terdefinisi secara spesifik.Kesalahan runtime dapat terjadi jika kunci tidak benar-benar ada di peta.
Jenis lainnya: Memicu kesalahan. C. Ulangi langkah sebelumnya untuk menghapus pengidentifikasi terakhir sebagai kolom. Terapkan aturan (A) dan (B) selama ada pengidentifikasi yang tersisa untuk ditafsirkan sebagai kolom.
gangguan alias kolom lateral
Berlaku untuk:
Databricks SQL
Databricks Runtime 12.2 LTS ke atasJika ekspresi berada dalam daftar
SELECT, cocokkan pengidentifikasi di depan dengan alias kolom sebelumnya dalam daftarSELECTtersebut.Jika ada lebih dari satu kecocokan tersebut, munculkan kesalahan AMBIGUOUS_LATERAL_COLUMN_ALIAS.
Cocokkan setiap pengidentifikasi yang tersisa sebagai bidang atau kunci peta, dan munculkan kesalahan FIELD_NOT_FOUND atau AMBIGUOUS_COLUMN_OR_FIELD jika tidak dapat dicocokkan.
Korelasi
LATERAL
Jika kueri didahului oleh kata kunci
LATERAL, terapkan aturan 1.a dan 1.d dengan mempertimbangkan referensi tabel diFROMyang berisi kueri dan sebelumLATERAL.Biasa
Jika kueri adalah subkueri skalar,
IN, atauEXISTSsubkueri menerapkan aturan 1.a, 1.d, dan 2 dengan mempertimbangkan referensi tabel dalam klausa kueriFROMyang berisi.
Korelasi berlapis
Terapkan ulang aturan 3 dengan mengulangi pada setiap tingkat bersarang dari kueri.
-
Jika pernyataan tersebut terkandung dalam perulangan
FOR:Sebuah. Cocokkan identifier dengan kolom dalam kueri pernyataan loop
FOR. Jika pengenal memenuhi syarat, kualifikasi harus cocok dengan nama variabel loop FOR jika ditentukan. B. Jika pengidentifikasi terkualifikasi, cocokkan dengan bidang atau kunci peta dari parameter sesuai dengan aturan 1.c -
Jika pernyataan terkandung dalam pernyataan gabungan:
Sebuah. Cocokkan pengidentifikasi dengan variabel yang dideklarasikan dalam pernyataan gabungan tersebut. Jika pengidentifikasi memenuhi syarat, kualifikasi harus cocok dengan label pernyataan gabungan jika didefinisikan. B. Jika pengidentifikasi memenuhi syarat, cocokkan dengan bidang atau kunci pada peta dari variabel sesuai dengan aturan 1.c
pernyataan gabungan berlapis atau
FORperulanganTerapkan kembali aturan 5 dan 6, iterasi di atas tingkat berlapis dari pernyataan gabungan.
Parameter rutin
Jika ekspresi adalah bagian dari CREATE FUNCTION atau pernyataan CREATE PROCEDURE :
Variabel Sesi
Batasan
Untuk mencegah eksekusi kueri berkorelasi yang berpotensi mahal, Azure Databricks membatasi korelasi yang didukung ke satu tingkat. Pembatasan ini juga berlaku untuk referensi parameter dalam fungsi SQL.
Contoh
-- 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 precedence 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
Resolusi tabel dan tampilan
Pengidentifikasi dalam referensi tabel dapat berupa salah satu dari berikut ini:
- Tabel atau tampilan persisten di Katalog Unity atau Metastore Apache Hive
- Ekspresi tabel yang umum (CTE)
- Tampilan sementara atau tabel sementara
Resolusi pengidentifikasi tergantung pada apakah pengidentifikasi tersebut berkualifikasi.
Memenuhi Syarat
Jika pengidentifikasi tersebut memenuhi kualifikasi sepenuhnya dengan tiga bagian:
catalog.schema.relation, maka pengidentifikasi tersebut adalah unik.Jika identifikasi terdiri dari dua bagian:
schema.relation, ini selanjutnya dikuatkan dengan hasilSELECT current_catalog()untuk membuatnya unik.Tidak memenuhi syarat
ekspresi tabel umum
Jika referensi berada dalam cakupan klausa
WITH, cocokkan pengidentifikasi dengan CTE yang dimulai dari klausaWITHyang langsung mengandungnya, lalu bergerak keluar dari situ.Tampilan sementara atau tabel sementara
Cocokkan pengidentifikasi dengan tampilan sementara atau tabel sementara yang ditentukan dalam sesi saat ini.
tabel yang persisten
Sepenuhnya memenuhi syarat pengidentifikasi dengan melakukan pra-pending hasil
SELECT current_catalog()danSELECT current_schema()dan mencarinya sebagai hubungan persisten.
Jika hubungan tidak dapat dipetakan ke tabel, tampilan, atau CTE apa pun, Databricks menghasilkan kesalahan TABLE_OR_VIEW_NOT_FOUND.
Contoh
-- 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.
Resolusi fungsi
Referensi fungsi dikenali oleh kumpulan tanda kurung berikutnya yang wajib.
Ini dapat menghasilkan:
- Fungsi bawaan yang disediakan oleh Azure Databricks,
- Fungsi sementara yang ditentukan pengguna yang dilingkup ke sesi saat ini, atau
- Fungsi yang ditentukan pengguna persisten disimpan di metastore Apache Hive atau Katalog Unity.
Resolusi nama fungsi tergantung pada apakah itu memenuhi syarat:
Memenuhi Syarat
Jika nama sepenuhnya memenuhi syarat dengan tiga bagian:
catalog.schema.function, itu unik.Jika nama terdiri dari dua bagian:
schema.function, itu diberi kualifikasi lebih lanjut dengan hasilSELECT current_catalog()agar menjadi unik.Fungsi ini kemudian dicari di katalog.
Tidak memenuhi syarat
Untuk nama fungsi yang tidak memenuhi syarat, Azure Databricks mengikuti urutan prioritas tetap (
PATH):Fungsi bawaan
Jika fungsi dengan nama ini ada di antara kumpulan fungsi bawaan, fungsi tersebut dipilih.
Fungsi sementara
Jika fungsi dengan nama ini ada di antara kumpulan fungsi sementara, fungsi tersebut dipilih.
Fungsi yang disimpan
Sepenuhnya memenuhi syarat nama fungsi dengan melakukan pra-pending hasil
SELECT current_catalog()danSELECT current_schema()dan mencarinya sebagai fungsi persisten.
Jika fungsi tidak dapat diselesaikan Azure Databricks menimbulkan kesalahan UNRESOLVED_ROUTINE .
Contoh
> 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