Bagikan melalui


BUAT TABEL EKSTERNAL (Transact-SQL)

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru dari Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform Analitik System (PDW)Warehouse di Microsoft FabricSQL database di Microsoft Fabric

Membuat tabel eksternal.

Artikel ini menyediakan sintaks, argumen, keterangan, izin, dan contoh untuk produk SQL mana pun yang Anda pilih.

Pilih produk

Di baris berikut, pilih nama produk yang Anda minati, dan hanya informasi produk yang ditampilkan.

* SQL Server *  

 

Gambaran Umum: SQL Server

Perintah ini membuat tabel eksternal untuk PolyBase untuk mengakses data yang disimpan dalam kluster Hadoop atau tabel eksternal Azure Blob Storage PolyBase yang mereferensikan data yang disimpan dalam kluster Hadoop atau Azure Blob Storage.

Berlaku untuk: SQL Server 2016 (13.x) dan versi yang lebih baru.

Gunakan tabel eksternal dengan sumber data eksternal untuk kueri PolyBase. Sumber data eksternal digunakan untuk membangun konektivitas dan mendukung kasus penggunaan utama ini:

Tabel eksternal didasarkan pada sumber data eksternal.

Konvensi sintaks Transact-SQL

Sintaks

-- Create a new external table
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ , ...n ] )
    WITH (
        LOCATION = 'folder_or_filepath' ,
        DATA_SOURCE = external_data_source_name ,
        [ FILE_FORMAT = external_file_format_name ]
        [ , <reject_options> [ , ...n ] ]
    )
[ ; ]

<reject_options> ::=
{
    | REJECT_TYPE = { value | percentage }
    | REJECT_VALUE = reject_value
    | REJECT_SAMPLE_VALUE = reject_sample_value ,
    | REJECTED_ROW_LOCATION = '/REJECT_Directory'
}

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

Argumen

{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Satu hingga tiga bagian nama tabel yang akan dibuat.

Untuk tabel eksternal, SQL hanya menyimpan metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk di Hadoop atau Azure Blob Storage. Tidak ada data aktual yang dipindahkan atau disimpan di SQL Server.

Penting

Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, Anda harus memberikan nama tiga bagian.

< > column_definition [ ,...n ]

CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak dapat menggunakan pada DEFAULT CONSTRAINT tabel eksternal.

Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file ditolak saat mengkueri data aktual.

LOCATION = 'folder_or_filepath'

Menentukan folder atau jalur file dan nama file untuk data aktual di Hadoop atau Azure Blob Storage. Selain itu, penyimpanan objek yang kompatibel dengan S3 didukung mulai SQL Server 2022 (16.x)). Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan dalam sumber data eksternal.

Di SQL Server, pernyataan CREATE EXTERNAL TABLE membuat jalur dan folder jika belum ada. Anda kemudian dapat menggunakan INSERT INTO untuk mengekspor data dari tabel SQL Server lokal ke sumber data eksternal. Untuk informasi selengkapnya, lihat Skenario kueri PolyBase.

Jika Anda menentukan LOCATION untuk menjadi folder, kueri PolyBase yang memilih dari tabel eksternal mengambil file dari folder dan semua subfoldernya. Sama seperti Hadoop, PolyBase tidak mengembalikan folder tersembunyi. Ini juga tidak mengembalikan file yang nama filenya dimulai dengan garis bawah (_) atau titik (.).

Dalam contoh gambar berikut, jika LOCATION='/webdata/', kueri PolyBase mengembalikan baris dari mydata.txt dan mydata2.txt. Ini tidak kembali mydata3.txt karena merupakan file dalam subfolder tersembunyi. Dan itu tidak kembali _hidden.txt karena itu adalah file tersembunyi.

Diagram folder dan data file untuk tabel eksternal.

Untuk mengubah default dan hanya membaca dari folder akar, atur atribut <polybase.recursive.traversal> ke 'false' dalam file konfigurasi core-site.xml. File ini terletak di bawah <SqlBinRoot>\PolyBase\Hadoop\Confbin akar SQL Server. Contohnya,C:\Program Files\Microsoft SQL Server\MSSQL13.XD14\MSSQL\Binn.

DATA_SOURCE = external_data_source_name

Menentukan nama sumber data eksternal yang berisi lokasi data eksternal. Lokasi ini adalah Hadoop File System (HDFS), kontainer Azure Blob Storage, atau Azure Data Lake Store. Untuk membuat sumber data eksternal, gunakan CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name

Menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

Format file eksternal dapat digunakan kembali oleh beberapa file eksternal serupa.

Opsi REJECT

Opsi ini hanya dapat digunakan dengan sumber data eksternal tempat TYPE = HADOOP.

Anda dapat menentukan parameter penolakan yang menentukan bagaimana PolyBase menangani rekaman kotor yang diambilnya dari sumber data eksternal. Rekaman data dianggap 'kotor' jika jenis data aktual atau jumlah kolom tidak cocok dengan definisi kolom tabel eksternal.

Saat Anda tidak menentukan atau mengubah nilai penolakan, PolyBase menggunakan nilai default. Informasi tentang parameter penolakan ini disimpan sebagai metadata tambahan saat Anda membuat tabel eksternal dengan CREATE EXTERNAL TABLE pernyataan. Saat pernyataan atau SELECT INTO SELECT pernyataan mendatang SELECT memilih data dari tabel eksternal, PolyBase menggunakan opsi penolakan untuk menentukan jumlah atau persentase baris yang dapat ditolak sebelum kueri aktual gagal. Kueri mengembalikan hasil (parsial) hingga ambang penolakan terlampaui. Kueri kemudian gagal dengan pesan kesalahan yang sesuai.

REJECT_TYPE = { value | percentage }

Mengklarifikasi apakah REJECT_VALUE opsi ditentukan sebagai nilai harfiah atau persentase.

  • nilai

    REJECT_VALUE adalah nilai harfiah, bukan persentase. Kueri gagal ketika jumlah baris yang ditolak melebihi reject_value.

    Misalnya, jika REJECT_VALUE = 5 dan REJECT_TYPE = value, SELECT kueri gagal setelah lima baris ditolak.

  • Persentase

    REJECT_VALUE adalah persentase, bukan nilai harfiah. Kueri gagal ketika persentase baris yang gagal melebihi reject_value. Persentase baris yang gagal dihitung pada interval.

REJECT_VALUE = reject_value

Menentukan nilai atau persentase baris yang dapat ditolak sebelum kueri gagal.

Untuk REJECT_TYPE = value, reject_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.

Untuk REJECT_TYPE = percentage, reject_value harus berupa float antara 0 dan 100.

REJECT_SAMPLE_VALUE = reject_sample_value

Atribut ini diperlukan saat Anda menentukan REJECT_TYPE = percentage. Ini menentukan jumlah baris untuk mencoba mengambil sebelum PolyBase menghitung ulang persentase baris yang ditolak.

Parameter reject_sample_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.

Misalnya, jika REJECT_SAMPLE_VALUE = 1000, PolyBase menghitung persentase baris yang gagal setelah mencoba mengimpor 1.000 baris dari file data eksternal. Jika persentase baris yang gagal kurang dari reject_value, PolyBase mencoba mengambil 1.000 baris lainnya. Ini terus menghitung ulang persentase baris yang gagal setelah mencoba mengimpor setiap 1.000 baris tambahan.

Catatan

Karena PolyBase menghitung persentase baris yang gagal pada interval, persentase aktual baris yang gagal dapat melebihi reject_value.

Example

Contoh ini menunjukkan bagaimana tiga REJECT opsi berinteraksi satu sama lain. Misalnya, jika REJECT_TYPE = percentage, , REJECT_VALUE = 30dan REJECT_SAMPLE_VALUE = 100, skenario berikut dapat terjadi:

  • PolyBase mencoba mengambil 100 baris pertama; 25 gagal dan 75 berhasil.
  • Persentase baris yang gagal dihitung sebagai 25%, yang kurang dari nilai penolakan 30%. Akibatnya, PolyBase terus mengambil data dari sumber data eksternal.
  • PolyBase mencoba memuat 100 baris berikutnya; kali ini 25 baris berhasil dan 75 baris gagal.
  • Persentase baris yang gagal dihitung ulang sebagai 50%. Persentase baris yang gagal telah melebihi nilai penolakan 30%.
  • Kueri PolyBase gagal dengan 50% baris yang ditolak setelah mencoba mengembalikan 200 baris pertama. Baris yang cocok dikembalikan sebelum kueri PolyBase mendeteksi ambang penolakan telah terlampaui.

REJECTED_ROW_LOCATION = lokasi direktori

Berlaku untuk: SQL Server 2019 (15.x) CU 6 dan versi yang lebih baru, dan Azure Synapse Analytics.

Menentukan direktori dalam Sumber Data Eksternal bahwa baris yang ditolak dan file kesalahan yang sesuai harus ditulis.

Jika jalur yang ditentukan tidak ada, PolyBase akan membuatnya atas nama Anda. Direktori anak dibuat dengan nama _rejectedrows. Karakter _ memastikan bahwa direktori lolos untuk pemrosesan data lain kecuali dinamai secara eksplisit dalam parameter lokasi. Dalam direktori ini, ada folder yang dibuat berdasarkan waktu pengiriman beban dalam format YearMonthDay -HourMinuteSecond (misalnya, 20230330-173205). Dalam folder ini, dua jenis file ditulis, _reason file dan file data. Opsi ini hanya dapat digunakan dengan sumber data eksternal di mana TYPE = HADOOP dan untuk tabel eksternal menggunakan DELIMITEDTEXTFORMAT_TYPE. Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL dan MEMBUAT FORMAT FILE EKSTERNAL.

Alasan file dan file data keduanya memiliki queryID yang terkait dengan pernyataan CTAS. Karena data dan alasannya ada dalam file terpisah, file yang sesuai memiliki akhiran yang cocok.

Izin

Memerlukan izin pengguna ini:

  • CREATE TABLE
  • ALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMAT (hanya berlaku untuk hadoop dan sumber data eksternal Azure Storage)
  • CONTROL DATABASE (hanya berlaku untuk hadoop dan sumber data eksternal Azure Storage)

Perhatikan, login jarak jauh yang ditentukan dalam DATABASE SCOPED CREDENTIAL yang digunakan dalam CREATE EXTERNAL TABLE perintah harus memiliki izin Baca untuk jalur/tabel/koleksi pada sumber data eksternal yang ditentukan dalam LOCATION parameter . Jika Anda berencana menggunakan ini EXTERNAL TABLE untuk mengekspor data ke hadoop atau sumber data eksternal Azure Storage, maka login yang ditentukan harus memiliki izin tulis pada jalur yang ditentukan dalam LOCATION. Hadoop tidak didukung di SQL Server 2022 (16.x).

Untuk Azure Blob Storage, saat mengonfigurasi kunci akses dan tanda tangan akses bersama (SAS) di portal Azure, akun penyimpanan Azure Blob Storage atau ADLS Gen2, konfigurasikan izin yang diizinkan untuk memberikan setidaknya izin Baca dan Tulis. Izin daftar mungkin juga diperlukan saat mencari di seluruh folder. Anda juga harus memilih Kontainer dan Objek sebagai jenis sumber daya yang diizinkan.

Penting

Izin ini ALTER ANY EXTERNAL DATA SOURCE memberikan kemampuan kepada perwakilan mana pun untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, ia juga memberikan kemampuan untuk mengakses semua kredensial cakupan database pada database. Izin ini harus dianggap sangat istimewa, dan oleh karena itu harus diberikan hanya kepada prinsipal tepercaya dalam sistem.

Penanganan kesalahan

Saat menjalankan pernyataan CREATE EXTERNAL TABLE, PolyBase mencoba menyambungkan ke sumber data eksternal. Jika upaya untuk menyambungkan gagal, pernyataan gagal dan tabel eksternal tidak dibuat. Diperlukan waktu satu menit atau lebih agar perintah gagal karena PolyBase mencoba kembali koneksi sebelum akhirnya gagal kueri.

Keterangan

Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, PolyBase menyimpan baris yang diambil dari sumber data eksternal dalam tabel sementara. Setelah kueri selesai, PolyBase menghapus dan menghapus tabel sementara. Tidak ada data permanen yang disimpan dalam tabel SQL. Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, PolyBase menyimpan baris yang diambil dari sumber data eksternal sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat PolyBase mengambil data eksternal.

Format Hadoop hanya didukung di SQL Server 2016 (13.x), SQL Server 2017 (14.x), dan SQL Server 2019 (15.x).

PolyBase dapat mendorong beberapa komputasi kueri ke Hadoop untuk meningkatkan performa kueri. Tindakan ini dikenal sebagai pushdown predikat. Untuk mengaktifkannya, tentukan opsi lokasi manajer sumber daya Hadoop di CREATE EXTERNAL DATA SOURCE.

Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.

Keterbatasan

Karena data untuk tabel eksternal tidak berada di bawah kontrol manajemen langsung SQL Server, data dapat diubah atau dihapus kapan saja oleh proses eksternal. Akibatnya, hasil kueri terhadap tabel eksternal tidak dijamin deterministik. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

Anda dapat membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda. Jika Anda secara bersamaan menjalankan kueri terhadap sumber data Hadoop yang berbeda, maka setiap sumber Hadoop harus menggunakan pengaturan konfigurasi server 'konektivitas hadoop' yang sama. Misalnya, Anda tidak dapat menjalankan kueri secara bersamaan terhadap kluster Cloudera Hadoop dan kluster Hortonworks Hadoop karena ini menggunakan pengaturan konfigurasi yang berbeda. Untuk pengaturan konfigurasi dan kombinasi yang didukung, lihat Konfigurasi konektivitas PolyBase.

Saat tabel eksternal menggunakan DELIMITEDTEXT, , CSV, PARQUETatau DELTA sebagai jenis data, tabel eksternal hanya mendukung statistik untuk satu kolom per CREATE STATISTICS perintah.

Hanya pernyataan Data Definition Language (DDL) ini yang diizinkan pada tabel eksternal:

  • CREATE TABLE dan DROP TABLE
  • CREATE STATISTICS dan DROP STATISTICS
  • CREATE VIEW dan DROP VIEW

Konstruksi dan operasi tidak didukung:

  • Batasan DEFAULT pada kolom tabel eksternal
  • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui

Batasan kueri

PolyBase dapat menggunakan maksimum 33k file per folder saat menjalankan 32 kueri PolyBase bersamaan. Jumlah maksimum ini mencakup file dan subfolder di setiap folder HDFS. Jika tingkat konkurensi kurang dari 32, pengguna dapat menjalankan kueri PolyBase terhadap folder dalam HDFS yang berisi lebih dari file 33k. Kami menyarankan agar Anda menjaga jalur file eksternal tetap pendek dan menggunakan tidak lebih dari 30k file per folder HDFS. Ketika terlalu banyak file direferensikan, pengecualian kehabisan memori Java Virtual Machine (JVM) mungkin terjadi.

Batasan lebar tabel

Di SQL Server 2016 (13.x), PolyBase memiliki batas lebar baris 32 KB berdasarkan ukuran maksimum satu baris yang valid menurut definisi tabel. Jika jumlah skema kolom lebih besar dari 32 KB, PolyBase tidak dapat mengkueri data.

Batasan jenis data

Tipe data berikut tidak dapat digunakan dalam tabel eksternal PolyBase:

  • geografi
  • geometri
  • hierarkis
  • gambar
  • teks
  • ntext
  • xml
  • Jenis yang ditentukan pengguna

Batasan spesifik sumber data

Oracle

Sinonim Oracle tidak didukung untuk penggunaan dengan PolyBase.

Tabel eksternal ke koleksi MongoDB yang berisi array

Gunakan sp_data_source_objects untuk mendeteksi skema koleksi (kolom) untuk koleksi MongoDB yang berisi array, dan buat tabel eksternal secara manual. Prosedur sp_data_source_table_columns tersimpan juga secara otomatis melakukan meratakan melalui Driver ODBC PolyBase untuk driver MongoDB.

Penguncian

Kunci bersama pada SCHEMARESOLUTION objek.

Keamanan

File data untuk tabel eksternal disimpan di Hadoop atau Azure Blob Storage. File data ini dibuat dan dikelola oleh proses Anda sendiri. Anda bertanggung jawab untuk mengelola keamanan data eksternal.

Contoh

J. Membuat tabel eksternal dengan data dalam format yang dibatasi teks

Contoh ini memperlihatkan semua langkah yang diperlukan untuk membuat tabel eksternal yang memiliki data yang diformat dalam file yang dibatasi teks. Ini mendefinisikan mydatasource sumber data eksternal dan format file eksternal myfileformat. Objek tingkat database ini kemudian dirujuk dalam pernyataan CREATE EXTERNAL TABLE. Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL dan MEMBUAT FORMAT FILE EKSTERNAL.

CREATE EXTERNAL DATA SOURCE mydatasource
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
);
GO

CREATE EXTERNAL FILE FORMAT myfileformat
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (FIELD_TERMINATOR = '|')
);
GO

CREATE EXTERNAL TABLE ClickStream
(
    url VARCHAR (50),
    event_date DATE,
    user_IP VARCHAR (50)
)
WITH (
    DATA_SOURCE = mydatasource,
    LOCATION = '/webdata/employee.tbl',
    FILE_FORMAT = myfileformat
);

B. Membuat tabel eksternal dengan data dalam format RCFile

Contoh ini memperlihatkan semua langkah yang diperlukan untuk membuat tabel eksternal yang memiliki data yang diformat sebagai RCFiles. Ini mendefinisikan mydatasource_rc sumber data eksternal dan format file eksternal myfileformat_rc. Objek tingkat database ini kemudian dirujuk dalam pernyataan CREATE EXTERNAL TABLE. Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL dan MEMBUAT FORMAT FILE EKSTERNAL.

CREATE EXTERNAL DATA SOURCE mydatasource_rc
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
);
GO

CREATE EXTERNAL FILE FORMAT myfileformat_rc
WITH (
    FORMAT_TYPE = RCFILE,
    SERDE_METHOD = 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
);
GO

CREATE EXTERNAL TABLE ClickStream_rc
(
    url VARCHAR (50),
    event_date DATE,
    user_ip VARCHAR (50)
)
WITH (
    DATA_SOURCE = mydatasource_rc,
    LOCATION = '/webdata/employee_rc.tbl',
    FILE_FORMAT = myfileformat_rc
);

C. Membuat tabel eksternal dengan data dalam format ORC

Contoh ini memperlihatkan semua langkah yang diperlukan untuk membuat tabel eksternal yang memiliki data yang diformat sebagai file ORC. Ini mendefinisikan mydatasource_orc sumber data eksternal dan format file eksternal myfileformat_orc. Objek tingkat database ini kemudian dirujuk dalam pernyataan CREATE EXTERNAL TABLE. Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL dan MEMBUAT FORMAT FILE EKSTERNAL.

CREATE EXTERNAL DATA SOURCE mydatasource_orc
WITH (
    TYPE = HADOOP,
    LOCATION = 'hdfs://xxx.xxx.xxx.xxx:8020'
);
GO

CREATE EXTERNAL FILE FORMAT myfileformat_orc
WITH (
    FORMAT = ORC,
    COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO

CREATE EXTERNAL TABLE ClickStream_orc (
    url VARCHAR (50),
    event_date DATE,
    user_ip VARCHAR (50)
)
WITH (
    LOCATION='/webdata/',
    DATA_SOURCE = mydatasource_orc,
    FILE_FORMAT = myfileformat_orc
);

D. Mengkueri data Hadoop

ClickStream adalah tabel eksternal yang terhubung ke employee.tbl file teks yang dibatasi pada kluster Hadoop. Kueri berikut ini terlihat seperti kueri terhadap tabel standar. Namun, kueri ini mengambil data dari Hadoop lalu menghitung hasilnya.

SELECT TOP 10 (url)
FROM ClickStream
WHERE user_ip = 'xxx.xxx.xxx.xxx';

E. Menggabungkan data Hadoop dengan data SQL

Kueri ini terlihat seperti standar JOIN pada dua tabel SQL. Perbedaannya adalah polyBase mengambil data clickstream dari Hadoop lalu menggabungkannya ke UrlDescription tabel. Satu tabel adalah tabel eksternal dan tabel lainnya adalah tabel SQL standar.

SELECT url.description
FROM ClickStream AS cs
     INNER JOIN UrlDescription AS url
         ON cs.url = url.name
WHERE cs.url = 'msdn.microsoft.com';

F. Mengimpor data dari Hadoop ke dalam tabel SQL

Contoh ini membuat tabel ms_user SQL baru yang secara permanen menyimpan hasil gabungan antara tabel user SQL standar dan tabel ClickStreameksternal .

SELECT DISTINCT user.FirstName, user.LastName
INTO ms_user
FROM user INNER JOIN (
    SELECT * FROM ClickStream WHERE cs.url = 'www.microsoft.com'
) AS ms
ON user.user_ip = ms.user_ip;

G. Membuat tabel eksternal untuk SQL Server

Sebelum Anda membuat kredensial lingkup database, database pengguna harus memiliki kunci master untuk melindungi kredensial. Untuk informasi selengkapnya, lihat MEMBUAT KUNCI MASTER dan MEMBUAT KREDENSIAL CAKUPAN DATABASE.

-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

/*  specify credentials to external data source
 *  IDENTITY: user name for external source.
 *  SECRET: password for external source.
 */
CREATE DATABASE SCOPED CREDENTIAL SqlServerCredentials
WITH
    IDENTITY = '<username>',
    SECRET = '<password>';

Buat sumber data eksternal baru bernama SQLServerInstance, dan tabel eksternal bernama sqlserver.customer:

/* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
*  PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
*  CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE SQLServerInstance
WITH (
LOCATION = 'sqlserver://SqlServer',
    -- PUSHDOWN = ON | OFF,
    CREDENTIAL = SQLServerCredentials
);
GO

CREATE SCHEMA sqlserver;

/* LOCATION: sql server table/view in 'database_name.schema_name.object_name' format
*  DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE sqlserver.customer (
    C_CUSTKEY INT NOT NULL,
    C_NAME VARCHAR(25) NOT NULL,
    C_ADDRESS VARCHAR(40) NOT NULL,
    C_NATIONKEY INT NOT NULL,
    C_PHONE CHAR(15) NOT NULL,
    C_ACCTBAL DECIMAL(15,2) NOT NULL,
    C_MKTSEGMENT CHAR(10) NOT NULL,
    C_COMMENT VARCHAR(117) NOT NULL
)
WITH (
    LOCATION='tpch_10.dbo.customer',
    DATA_SOURCE=SqlServerInstance
);

Saya. Membuat tabel eksternal untuk Oracle

-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH
    IDENTITY = '<username>',
    SECRET = '<password>';
GO

/*
* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
    LOCATION = 'oracle://<server address>[:<port>]',
    -- PUSHDOWN = ON | OFF,CREDENTIAL = credential_name
);

/*
* LOCATION: Oracle table/view in '<database_name>.<schema_name>.<object_name>' format. This may be case sensitive in the Oracle database.
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customers
(
    [O_ORDERKEY] DECIMAL (38) NOT NULL,
    [O_CUSTKEY] DECIMAL (38) NOT NULL,
    [O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
    [O_TOTALPRICE] DECIMAL (15, 2) NOT NULL,
    [O_ORDERDATE] DATETIME2 (0) NOT NULL,
    [O_ORDERPRIORITY] CHAR (15) COLLATE Latin1_General_BIN NOT NULL,
    [O_CLERK] CHAR (15) COLLATE Latin1_General_BIN NOT NULL,
    [O_SHIPPRIORITY] DECIMAL (38) NOT NULL,
    [O_COMMENT] VARCHAR (79) COLLATE Latin1_General_BIN NOT NULL
)
WITH (
    DATA_SOURCE = external_data_source_name,
    LOCATION = 'DB1.mySchema.customer'
);

j. Membuat tabel eksternal untuk Teradata

-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH
    IDENTITY = '<username>',
    SECRET = '<password>';
GO

/* LOCATION: Location string should be of format '<vendor>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
    LOCATION = teradata://<server address>[:<port>],
    -- PUSHDOWN = ON | OFF,
    CREDENTIAL =credential_name
);
GO

/* LOCATION: Teradata table/view in '<database_name>.<object_name>' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customer(
    L_ORDERKEY INT NOT NULL,
    L_PARTKEY INT NOT NULL,
    L_SUPPKEY INT NOT NULL,
    L_LINENUMBER INT NOT NULL,
    L_QUANTITY DECIMAL(15,2) NOT NULL,
    L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL,
    L_DISCOUNT DECIMAL(15,2) NOT NULL,
    L_TAX DECIMAL(15,2) NOT NULL,
    L_RETURNFLAG CHAR NOT NULL,
    L_LINESTATUS CHAR NOT NULL,
    L_SHIPDATE DATE NOT NULL,
    L_COMMITDATE DATE NOT NULL,
    L_RECEIPTDATE DATE NOT NULL,
    L_SHIPINSTRUCT CHAR(25) NOT NULL,
    L_SHIPMODE CHAR(10) NOT NULL,
    L_COMMENT VARCHAR(44) NOT NULL
)
WITH (
    LOCATION='customer',
    DATA_SOURCE= external_data_source_name
);

K. Membuat tabel eksternal untuk MongoDB

-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
GO

/*
* Specify credentials to external data source
* IDENTITY: user name for external source.
* SECRET: password for external source.
*/
CREATE DATABASE SCOPED CREDENTIAL credential_name
WITH
    IDENTITY = '<username>',
    SECRET = '<password>';
GO

/* LOCATION: Location string should be of format '<type>://<server>[:<port>]'.
* PUSHDOWN: specify whether computation should be pushed down to the source. ON by default.
* CONNECTION_OPTIONS: Specify driver location
* CREDENTIAL: the database scoped credential, created above.
*/
CREATE EXTERNAL DATA SOURCE external_data_source_name
WITH (
    LOCATION = mongodb://<server>[:<port>],
    -- PUSHDOWN = ON | OFF,
    CREDENTIAL = credential_name
);

/* LOCATION: MongoDB table/view in '<database_name>.<schema_name>.<object_name>' format
* DATA_SOURCE: the external data source, created above.
*/
CREATE EXTERNAL TABLE customers(
    [O_ORDERKEY] DECIMAL(38) NOT NULL,
    [O_CUSTKEY] DECIMAL(38) NOT NULL,
    [O_ORDERSTATUS] CHAR COLLATE Latin1_General_BIN NOT NULL,
    [O_TOTALPRICE] DECIMAL(15,2) NOT NULL,
    [O_ORDERDATE] DATETIME2(0) NOT NULL,
    [O_COMMENT] VARCHAR(79) COLLATE Latin1_General_BIN NOT NULL
)
WITH (
    LOCATION='customer',
    DATA_SOURCE= external_data_source_name
);

L. Kueri penyimpanan objek yang kompatibel dengan S3 melalui tabel eksternal

Berlaku untuk: SQL Server 2022 (16.x) dan versi yang lebih baru.

Contoh berikut menunjukkan penggunaan T-SQL untuk mengkueri file parket yang disimpan dalam penyimpanan objek yang kompatibel dengan S3 melalui kueri tabel eksternal. Sampel menggunakan jalur relatif dalam sumber data eksternal.

CREATE EXTERNAL DATA SOURCE s3_ds
WITH
(   LOCATION = 's3://<ip_address>:<port>/',
    CREDENTIAL = s3_dc
);
GO

CREATE EXTERNAL FILE FORMAT ParquetFileFormat
WITH(
    FORMAT_TYPE = PARQUET
);
GO

CREATE EXTERNAL TABLE Region (
    r_regionkey BIGINT,
    r_name CHAR(25),
    r_comment VARCHAR(152)
)
WITH (
    LOCATION = '/region/',
    DATA_SOURCE = 's3_ds',
    FILE_FORMAT = ParquetFileFormat
);

* Database Azure SQL *  

 

Gambaran Umum: Azure SQL Database

Membuat tabel eksternal, digunakan untuk:

Lihat juga MEMBUAT SUMBER DATA EKSTERNAL.

Sintaks

Untuk digunakan dengan virtualisasi Data (pratinjau)

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ , ...n ] )
    WITH (
        LOCATION = 'filepath' ,
        DATA_SOURCE = external_data_source_name ,
        FILE_FORMAT = external_file_format_name
    )
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

Untuk digunakan dengan kueri Elastis (pratinjau):

-- Create a table for use with elastic query
CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ , ...n ] )
    WITH ( <sharded_external_table_options> )
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<sharded_external_table_options> ::=
        DATA_SOURCE = external_data_source_name ,
        SCHEMA_NAME = N'nonescaped_schema_name' ,
        OBJECT_NAME = N'nonescaped_object_name' ,
        [ DISTRIBUTION  = SHARDED(sharding_column_name) | REPLICATED | ROUND_ROBIN ] ]
    )
[ ; ]

Argumen

{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Satu hingga tiga bagian nama tabel yang akan dibuat.

Untuk tabel eksternal, SQL hanya menyimpan metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk di Azure SQL Database. Tidak ada data aktual yang dipindahkan atau disimpan di Azure SQL Database saat tabel eksternal dibuat.

Penting

Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, Anda harus memberikan nama tiga bagian.

< > column_definition [ ,...n ]

CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak dapat menggunakan pada DEFAULT CONSTRAINT tabel eksternal. Jenis data ini tidak didukung untuk kolom dalam tabel eksternal untuk Azure SQL Database:

  • geografi
  • geometri
  • hierarkis
  • gambar
  • teks
  • ntext
  • xml
  • json
  • Jenis yang ditentukan pengguna

Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file ditolak saat mengkueri data aktual.

Opsi tabel eksternal yang dipecah

Menentukan sumber data eksternal (sumber data non-SQL Server) dan metode distribusi untuk kueri Elastis.

LOCATION = 'folder_or_filepath'

Menentukan folder atau jalur file dan nama file untuk data aktual di Azure Data Lake Gen2 atau Azure Blob Storage. Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan dalam sumber data eksternal. CREATE EXTERNAL TABLE tidak membuat jalur dan folder.

Jika Anda menentukan LOCATION untuk menjadi folder, kueri yang memilih dari tabel eksternal mengambil file dari folder tetapi tidak semua subfoldernya.

Azure SQL Managed Instance tidak dapat menemukan file di subfolder atau folder tersembunyi. Ini juga tidak mengembalikan file yang nama filenya dimulai dengan garis bawah (_) atau titik (.).

Dalam contoh gambar berikut, jika LOCATION='/webdata/', kueri mengembalikan baris dari mydata.txt. Ini tidak kembali mydata2.txt karena berada di subfolder, itu tidak kembali mydata3.txt karena berada di folder tersembunyi, dan tidak kembali _hidden.txt karena itu adalah file tersembunyi.

Diagram folder dan data file untuk tabel eksternal.

Sumber_Data

DATA_SOURCE menentukan nama sumber data eksternal yang berisi lokasi data eksternal. Untuk membuat sumber data eksternal, gunakan CREATE EXTERNAL DATA SOURCE. Untuk contoh dalam kueri elastis, DATA_SOURCE adalah peta shard, lihat Membuat tabel eksternal.

FILE_FORMAT = external_file_format_name

Menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

SCHEMA_NAME dan OBJECT_NAME

Untuk digunakan dengan kueri elastis saja.

Klausa SCHEMA_NAME dan OBJECT_NAME memetakan definisi tabel eksternal ke tabel dalam skema yang berbeda. Jika dihilangkan, skema objek jarak jauh diasumsikan dbosebagai , dan namanya diasumsikan identik dengan nama tabel eksternal yang ditentukan. Skema ini berguna jika nama tabel jarak jauh Anda sudah diambil dalam database tempat Anda ingin membuat tabel eksternal. Misalnya, Anda ingin menentukan tabel eksternal untuk mendapatkan tampilan agregat tampilan katalog atau DMV pada tingkat data yang skalanya diperluas. Karena tampilan katalog dan DMV sudah ada secara lokal, Anda tidak dapat menggunakan namanya untuk definisi tabel eksternal. Sebagai gantinya, gunakan nama yang berbeda dan gunakan tampilan katalog atau nama DMV dalam SCHEMA_NAME klausa dan/atau OBJECT_NAME . Misalnya, lihat Membuat tabel eksternal.

DISTRIBUSI

Untuk digunakan dengan kueri elastis saja.

Opsional. Argumen ini hanya diperlukan untuk database jenis SHARD_MAP_MANAGER. Argumen ini mengontrol apakah tabel diperlakukan sebagai tabel pecahan atau tabel yang direplikasi. Dengan SHARDED (<column name>) tabel, data dari tabel yang berbeda tidak tumpang tindih. REPLICATED menentukan bahwa tabel memiliki data yang sama pada setiap shard. ROUND_ROBIN menunjukkan bahwa metode khusus aplikasi digunakan untuk mendistribusikan data.

Klausa DISTRIBUTION menentukan distribusi data yang digunakan untuk tabel ini. Prosesor kueri menggunakan informasi yang disediakan dalam DISTRIBUTION klausul untuk membangun rencana kueri yang paling efisien.

  • SHARDED berarti data dipartisi secara horizontal di seluruh database. Kunci partisi untuk distribusi data adalah sharding_column_name parameter .
  • REPLICATED berarti bahwa salinan tabel yang identik ada di setiap database. Anda bertanggung jawab untuk memastikan bahwa replika identik di seluruh database.
  • ROUND_ROBIN berarti bahwa tabel dipartisi secara horizontal menggunakan metode distribusi yang bergantung pada aplikasi.

Izin

Pengguna dengan akses ke tabel eksternal secara otomatis akan mendapatkan akses ke tabel jarak jauh yang mendasarinya di bawah info masuk yang diberikan dalam definisi sumber data eksternal. Hindari elevasi melalui info masuk sumber data eksternal. Gunakan GRANT atau REVOKE untuk tabel eksternal seolah-olah tabel biasa. Setelah menentukan sumber data eksternal dan tabel eksternal Anda, sekarang Anda dapat menggunakan T-SQL lengkap di atas tabel eksternal.

CREATE EXTERNAL TABLE memerlukan izin pengguna ini:

  • CREATE TABLE
  • ALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASE izin diperlukan untuk hanya membuat kunci master, kredensial cakupan database, dan sumber data eksternal.

Perhatikan, login yang membuat sumber data eksternal harus memiliki izin untuk membaca dan menulis ke sumber data eksternal, yang terletak di Hadoop atau Azure Blob Storage.

Penting

Izin ini ALTER ANY EXTERNAL DATA SOURCE memberikan kemampuan kepada perwakilan mana pun untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, ia juga memberikan kemampuan untuk mengakses semua kredensial cakupan database pada database. Izin ini harus dianggap sangat istimewa, dan oleh karena itu harus diberikan hanya kepada prinsipal tepercaya dalam sistem.

Penguncian

Kunci bersama pada SCHEMARESOLUTION objek.

Keterangan

Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, baris yang diambil dari sumber data eksternal disimpan dalam tabel sementara. Setelah kueri selesai, baris dihapus dan tabel sementara dihapus. Tidak ada data permanen yang disimpan dalam tabel SQL.

Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, baris yang diambil dari sumber data eksternal disimpan sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat data eksternal diambil.

Saat ini, virtualisasi data dengan Azure SQL Database bersifat baca-saja.

Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.

Batasan lebar tabel

Batas lebar baris 1 MB didasarkan pada ukuran maksimum satu baris yang valid menurut definisi tabel. Jika jumlah skema kolom lebih besar dari 1 MB, kueri virtualisasi data gagal.

Penanganan kesalahan

Saat menjalankan CREATE EXTERNAL TABLE pernyataan, jika upaya untuk menyambungkan gagal, pernyataan gagal dan tabel eksternal tidak dibuat. Diperlukan waktu satu menit atau lebih agar perintah gagal karena SQL Database mencoba kembali koneksi sebelum akhirnya gagal kueri.

Keterbatasan

Karena data untuk tabel eksternal tidak berada di bawah kontrol manajemen langsung Mesin Database atau Azure SQL Database, data dapat diubah atau dihapus kapan saja oleh proses eksternal. Akibatnya, hasil kueri terhadap tabel eksternal tidak dijamin deterministik. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

Anda dapat membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda.

Hanya pernyataan Data Definition Language (DDL) ini yang diizinkan pada tabel eksternal:

  • CREATE TABLE dan DROP TABLE
  • CREATE STATISTICS dan DROP STATISTICS
  • CREATE VIEW dan DROP VIEW

Konstruksi dan operasi tidak didukung:

  • Batasan DEFAULT pada kolom tabel eksternal.
  • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui.

Batasan dengan kueri elastis

  • semantik Isolasi: Akses ke data melalui tabel eksternal tidak mematuhi semantik isolasi dalam SQL Server. Ini berarti bahwa mengkueri tabel eksternal tidak memberlakukan penguncian atau isolasi rekam jepret apa pun. Oleh karena itu, pengembalian data dapat berubah jika data di sumber data eksternal berubah. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

  • Konstruksi dan operasi tidak didukung:

    • Batasan DEFAULT pada kolom tabel eksternal.
    • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui.
    • Masking data dinamis pada kolom tabel eksternal.
    • Kursor tidak didukung untuk tabel eksternal di Azure SQL Database.
  • Hanya predikat harfiah: Hanya predikat harfiah yang ditentukan dalam kueri yang dapat didorong ke sumber data eksternal. Ini tidak seperti server tertaut dan mengakses di mana predikat yang ditentukan selama eksekusi kueri dapat digunakan, yaitu, ketika digunakan dengan perulangan berlapis dalam rencana kueri. Ini sering menyebabkan seluruh tabel eksternal disalin secara lokal dan kemudian digabungkan.

    Dalam contoh berikut, jika External.Orders adalah tabel eksternal dan Customer adalah tabel lokal, kueri menyalin seluruh tabel eksternal secara lokal karena predikat yang diperlukan tidak diketahui pada waktu kompilasi.

    SELECT Orders.OrderId, Orders.OrderTotal
    FROM External.Orders
    WHERE CustomerId IN (
        SELECT TOP 1 CustomerId
        FROM Customer
        WHERE CustomerName = 'MyCompany'
    );
    
  • Tidak ada paralelisme: Penggunaan tabel eksternal mencegah penggunaan paralelisme dalam rencana kueri.

  • Dijalankan sebagai kueri jarak jauh: Tabel eksternal diimplementasikan sebagai kueri jarak jauh, sehingga perkiraan jumlah baris yang dikembalikan umumnya 1000. Ada aturan lain berdasarkan jenis predikat yang digunakan untuk memfilter tabel eksternal. Ini adalah perkiraan berbasis aturan daripada perkiraan berdasarkan data aktual dalam tabel eksternal. Pengoptimal tidak mengakses sumber data jarak jauh untuk mendapatkan perkiraan yang lebih akurat.

  • Tidak didukung untuk titik akhir privat: Kueri tabel eksternal tidak didukung saat koneksi ke tabel jarak jauh adalah titik akhir privat.

Contoh

Untuk contoh selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL atau lihat Virtualisasi data dengan Azure SQL Database.

J. Membuat tabel eksternal untuk Kueri Elastis

CREATE EXTERNAL TABLE [dbo].[CustomerInformation]
(
    [CustomerID] INT NOT NULL,
    [CustomerName] VARCHAR (50) NOT NULL,
    [Company] VARCHAR (50) NOT NULL
)
WITH (
    DATA_SOURCE = MyElasticDBQueryDataSrc
);

B. Membuat tabel eksternal untuk sumber data pecahan

Contoh ini memetakan ulang DMV jarak jauh ke tabel eksternal menggunakan SCHEMA_NAME klausa dan OBJECT_NAME .

CREATE EXTERNAL TABLE [dbo].[all_dm_exec_requests]
(
    [session_id] SMALLINT NOT NULL,
    [request_id] INT NOT NULL,
    [start_time] DATETIME NOT NULL,
    [status] NVARCHAR (30) NOT NULL,
    [command] NVARCHAR (32) NOT NULL,
    [sql_handle] VARBINARY (64),
    [statement_start_offset] INT,
    [statement_end_offset] INT,
    [cpu_time] INT NOT NULL
)
WITH (
    DATA_SOURCE = MyExtSrc,
    SCHEMA_NAME = 'sys',
    OBJECT_NAME = 'dm_exec_requests',
    DISTRIBUTION = ROUND_ROBIN
);

C. Mengkueri data eksternal dari Azure SQL Database dengan tabel eksternal

  1. Untuk membuat kredensial lingkup database di Azure SQL Database, Anda harus terlebih dahulu membuat kunci master database, jika belum ada. Kunci master database diperlukan ketika kredensial memerlukan SECRET.

    -- Create MASTER KEY if it doesn't exist in the database:
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
    
  2. Buat kredensial cakupan database menggunakan token SAS. Anda juga dapat menggunakan identitas terkelola.

    CREATE DATABASE SCOPED CREDENTIAL MyCredential
    WITH
        IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = '<KEY>'; --Removing leading '?'
    
  3. Buat sumber data eksternal menggunakan kredensial.

    --Create external data source pointing to the file path, and referencing database-scoped credential:
    CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
    WITH (
        LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
        CREDENTIAL = [MyCredential]
    );
    
  4. EXTERNAL FILE FORMAT Buat dan EXTERNAL TABLE, untuk mengkueri data seolah-olah tabel lokal.

    -- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE
    
    --Create external file format
    CREATE EXTERNAL FILE FORMAT DemoFileFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
    --Create external table:
    CREATE EXTERNAL TABLE tbl_TaxiRides
    (
        vendorID VARCHAR (100) COLLATE Latin1_General_BIN2,
        tpepPickupDateTime DATETIME2,
        tpepDropoffDateTime DATETIME2,
        passengerCount INT,
        tripDistance FLOAT,
        puLocationId VARCHAR (8000),
        doLocationId VARCHAR (8000),
        startLon FLOAT,
        startLat FLOAT,
        endLon FLOAT,
        endLat FLOAT,
        rateCodeId SMALLINT,
        storeAndFwdFlag VARCHAR (8000),
        paymentType VARCHAR (8000),
        fareAmount FLOAT,
        extra FLOAT,
        mtaTax FLOAT,
        improvementSurcharge VARCHAR (8000),
        tipAmount FLOAT,
        tollsAmount FLOAT,
        totalAmount FLOAT
    )
    WITH (
        DATA_SOURCE = NYCTaxiExternalDataSource,
        LOCATION = 'yellow/puYear = */puMonth = */*.parquet',
        FILE_FORMAT = MyFileFormat
    );
    
    --Then, query the data via an external table with T-SQL:
    SELECT TOP 10 *
    FROM tbl_TaxiRides;
    

* Azure Synapse
Analytics*
 

 

Ringkasan: Azure Synapse Analytics

Gunakan tabel eksternal untuk:

  • Kumpulan SQL khusus dapat mengkueri, mengimpor, dan menyimpan data dari Hadoop, Azure Blob Storage, dan Azure Data Lake Storage Gen1 dan Gen2.
  • Kumpulan SQL tanpa server dapat mengkueri, mengimpor, dan menyimpan data dari Azure Blob Storage, dan Azure Data Lake Storage Gen1 dan Gen2. Tanpa server tidak mendukung TYPE=Hadoop.

Lihat juga MEMBUAT SUMBER DATA EKSTERNAL dan MENGHILANGKAN TABEL EKSTERNAL.

Untuk informasi dan contoh selengkapnya tentang menggunakan tabel eksternal dengan Azure Synapse, lihat Menggunakan tabel eksternal dengan Synapse SQL.

Sintaks

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ ,...n ] )
    WITH (
        LOCATION = 'hdfs_folder_or_filepath',
        DATA_SOURCE = external_data_source_name,
        FILE_FORMAT = external_file_format_name
        [ , <reject_options> [ ,...n ] ]
    )
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<reject_options> ::=
{
    | REJECT_TYPE = { value | percentage },
    | REJECT_VALUE = reject_value,
    | REJECT_SAMPLE_VALUE = reject_sample_value,
    | REJECTED_ROW_LOCATION = '/REJECT_Directory'
}

Argumen

{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Satu hingga tiga bagian nama tabel yang akan dibuat.

Untuk tabel eksternal, hanya metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk di Azure Data Lake, Hadoop, atau Azure Blob Storage. Tidak ada data aktual yang dipindahkan atau disimpan saat tabel eksternal dibuat.

Penting

Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, Anda harus memberikan nama tiga bagian.

< > column_definition [ ,...n ]

CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak dapat menggunakan pada DEFAULT CONSTRAINT tabel eksternal.

Catatan

Teks jenis data, ntext, dan xml tidak didukung jenis data untuk kolom dalam tabel eksternal untuk Synapse Analytics.

  • Saat membaca file yang dibatasi, definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file ditolak saat mengkueri data aktual.
  • Saat membaca dari file Parquet, Anda hanya dapat menentukan kolom yang ingin Anda baca dan melewati sisanya.

LOCATION = 'folder_or_filepath'

Menentukan folder atau jalur file dan nama file untuk data aktual di Azure Data Lake, Hadoop, atau Azure Blob Storage. Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan dalam sumber data eksternal. Pernyataan CREATE EXTERNAL TABLE AS SELECT (CETAS) membuat jalur dan folder jika tidak ada. CREATE EXTERNAL TABLE tidak membuat jalur dan folder.

Jika Anda menentukan LOCATION untuk menjadi folder, kueri PolyBase yang memilih dari tabel eksternal mengambil file dari folder dan semua subfoldernya. Sama seperti Hadoop, PolyBase tidak mengembalikan folder tersembunyi. Ini juga tidak mengembalikan file yang nama filenya dimulai dengan garis bawah (_) atau titik (.).

Dalam contoh gambar berikut, jika LOCATION='/webdata/', kueri PolyBase mengembalikan baris dari mydata.txt dan mydata2.txt. Ini tidak kembali mydata3.txt karena berada di subfolder folder tersembunyi, dan tidak kembali _hidden.txt karena merupakan file tersembunyi.

Diagram folder dan data file untuk tabel eksternal.

Tidak seperti tabel eksternal Hadoop, tabel eksternal asli tidak mengembalikan subfolder kecuali Anda menentukan /** di akhir jalur. Dalam contoh ini, jika LOCATION='/webdata/', kueri kumpulan SQL tanpa server mengembalikan baris dari mydata.txt. Ini tidak kembali mydata2.txt dan mydata3.txt karena terletak di subfolder. Tabel Hadoop mengembalikan semua file dalam subfolder apa pun.

Tabel eksternal Hadoop dan asli melewati file dengan nama yang dimulai dengan garis bawah (_) atau titik (.).

DATA_SOURCE = external_data_source_name

Menentukan nama sumber data eksternal yang berisi lokasi data eksternal. Lokasi ini berada di Azure Data Lake. Untuk membuat sumber data eksternal, gunakan CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name

Menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

Opsi_Tabel

Menentukan kumpulan opsi yang menjelaskan cara membaca file yang mendasar. Saat ini, satu-satunya yang tersedia adalah {"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}, yang menginstruksikan tabel eksternal untuk mengabaikan pembaruan yang dibuat pada file yang mendasar, bahkan jika ini dapat menyebabkan beberapa operasi baca yang tidak konsisten. Gunakan opsi ini hanya dalam kasus khusus, yakni saat Anda sering menambahkan file. Opsi ini tersedia di kumpulan SQL tanpa server untuk format CSV.

Opsi REJECT

Opsi penolakan dalam pratinjau untuk kumpulan SQL tanpa server di Azure Synapse Analytics.

Opsi ini hanya dapat digunakan dengan sumber data eksternal tempat TYPE = HADOOP.

Anda dapat menentukan parameter penolakan yang menentukan bagaimana PolyBase menangani rekaman kotor yang diambilnya dari sumber data eksternal. Rekaman data dianggap 'kotor' jika jenis data aktual atau jumlah kolom tidak cocok dengan definisi kolom tabel eksternal.

Saat Anda tidak menentukan atau mengubah nilai penolakan, PolyBase menggunakan nilai default. Informasi tentang parameter penolakan ini disimpan sebagai metadata tambahan saat Anda membuat tabel eksternal dengan CREATE EXTERNAL TABLE pernyataan. Saat pernyataan atau SELECT INTO SELECT pernyataan mendatang SELECT memilih data dari tabel eksternal, PolyBase menggunakan opsi penolakan untuk menentukan jumlah atau persentase baris yang dapat ditolak sebelum kueri aktual gagal. Kueri mengembalikan hasil (parsial) hingga ambang penolakan terlampaui. Kueri kemudian gagal dengan pesan kesalahan yang sesuai.

Opsi PARSER_VERSION format hanya didukung di kumpulan SQL tanpa server.

REJECT_TYPE = { value | percentage }

Mengklarifikasi apakah REJECT_VALUE opsi ditentukan sebagai nilai harfiah atau persentase.

  • nilai

    REJECT_VALUE adalah nilai harfiah, bukan persentase. Kueri PolyBase gagal ketika jumlah baris yang ditolak melebihi reject_value.

    Kueri gagal ketika jumlah baris yang ditolak melebihi reject_value. Misalnya, jika REJECT_VALUE = 5 dan REJECT_TYPE = value, kueri PolyBase SELECT gagal setelah lima baris ditolak.

  • Persentase

    REJECT_VALUE adalah persentase, bukan nilai harfiah. Kueri PolyBase gagal ketika persentase baris yang gagal melebihi reject_value. Persentase baris yang gagal dihitung pada interval.

    • Untuk REJECT_TYPE = value, reject_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.
    • Untuk REJECT_TYPE = percentage, reject_value harus berupa float antara 0 dan 100. Persentase hanya berlaku untuk kumpulan SQL khusus di mana TYPE = HADOOP.

REJECT_SAMPLE_VALUE = reject_sample_value

Atribut ini diperlukan saat Anda menentukan REJECT_TYPE = percentage. Ini menentukan jumlah baris untuk mencoba mengambil sebelum PolyBase menghitung ulang persentase baris yang ditolak.

Parameter reject_sample_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.

Misalnya, jika REJECT_SAMPLE_VALUE = 1000, PolyBase menghitung persentase baris yang gagal setelah mencoba mengimpor 1.000 baris dari file data eksternal. Jika persentase baris yang gagal kurang dari reject_value, PolyBase mencoba mengambil 1.000 baris lainnya. Ini terus menghitung ulang persentase baris yang gagal setelah mencoba mengimpor setiap 1.000 baris tambahan.

Catatan

Karena PolyBase menghitung persentase baris yang gagal pada interval, persentase aktual baris yang gagal dapat melebihi reject_value.

Example

Contoh ini menunjukkan bagaimana tiga REJECT opsi berinteraksi satu sama lain. Misalnya, jika REJECT_TYPE = percentage, , REJECT_VALUE = 30dan REJECT_SAMPLE_VALUE = 100, skenario berikut dapat terjadi:

  • PolyBase mencoba mengambil 100 baris pertama; 25 gagal dan 75 berhasil.
  • Persentase baris yang gagal dihitung sebagai 25%, yang kurang dari nilai penolakan 30%. Akibatnya, PolyBase terus mengambil data dari sumber data eksternal.
  • PolyBase mencoba memuat 100 baris berikutnya; kali ini 25 baris berhasil dan 75 baris gagal.
  • Persentase baris yang gagal dihitung ulang sebagai 50%. Persentase baris yang gagal telah melebihi nilai penolakan 30%.
  • Kueri PolyBase gagal dengan 50% baris yang ditolak setelah mencoba mengembalikan 200 baris pertama. Baris yang cocok dikembalikan sebelum kueri PolyBase mendeteksi ambang penolakan telah terlampaui.

REJECTED_ROW_LOCATION = lokasi direktori

Menentukan direktori dalam Sumber Data Eksternal bahwa baris yang ditolak dan file kesalahan yang sesuai harus ditulis.

Jika jalur yang ditentukan tidak ada, jalur tersebut akan dibuat. Direktori anak dibuat dengan nama _rejectedrows. Karakter _ memastikan bahwa direktori lolos untuk pemrosesan data lain kecuali dinamai secara eksplisit dalam parameter lokasi.

  • Di kumpulan SQL tanpa server, jalurnya adalah YearMonthDay_HourMinuteSecond_StatementID. Anda dapat menggunakan statementID untuk menghubungkan folder dengan kueri yang membuatnya.
  • Dalam kumpulan SQL khusus, jalur yang dibuat didasarkan pada waktu pengiriman beban dalam format YearMonthDay -HourMinuteSecond, misalnya 20180330-173205.

Dalam folder ini, dua jenis file ditulis, _reason file dan file data.

Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL.

File alasan dan file data keduanya memiliki queryID yang terkait dengan pernyataan CTAS. Karena data dan alasannya ada dalam file terpisah, file yang sesuai memiliki akhiran yang cocok.

Dalam kumpulan SQL tanpa server, error.json file berisi array JSON dengan kesalahan yang ditemui terkait dengan baris yang ditolak. Setiap elemen yang menunjukkan kesalahan berisi atribut berikut:

Atribut Deskripsi
Error Alasan mengapa baris ditolak.
Row Nomor ordinal baris yang ditolak dalam file.
Column Nomor ordinal kolom yang ditolak.
Value Nilai kolom yang ditolak. Jika nilainya lebih besar dari 100 karakter, hanya 100 karakter pertama yang ditampilkan.
File Jalur ke file tempat baris berada.

Izin

Memerlukan izin pengguna ini:

  • CREATE TABLE
  • ALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASE izin diperlukan untuk hanya membuat kunci master, kredensial cakupan database, dan sumber data eksternal.

Perhatikan, login yang membuat sumber data eksternal harus memiliki izin untuk membaca dan menulis ke sumber data eksternal, yang terletak di Hadoop atau Azure Blob Storage.

Penting

Izin ini ALTER ANY EXTERNAL DATA SOURCE memberikan kemampuan kepada perwakilan mana pun untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, ia juga memberikan kemampuan untuk mengakses semua kredensial cakupan database pada database. Izin ini harus dianggap sangat istimewa, dan oleh karena itu harus diberikan hanya kepada prinsipal tepercaya dalam sistem.

Penanganan kesalahan

Saat menjalankan pernyataan CREATE EXTERNAL TABLE, PolyBase mencoba menyambungkan ke sumber data eksternal. Jika upaya untuk menyambungkan gagal, pernyataan gagal dan tabel eksternal tidak dibuat. Diperlukan waktu satu menit atau lebih agar perintah gagal karena PolyBase mencoba kembali koneksi sebelum akhirnya gagal kueri.

Keterangan

Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, PolyBase menyimpan baris yang diambil dari sumber data eksternal dalam tabel sementara. Setelah kueri selesai, PolyBase menghapus dan menghapus tabel sementara. Tidak ada data permanen yang disimpan dalam tabel SQL.

Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, PolyBase menyimpan baris yang diambil dari sumber data eksternal sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat PolyBase mengambil data eksternal.

PolyBase dapat mendorong beberapa komputasi kueri ke Hadoop untuk meningkatkan performa kueri. Tindakan ini dikenal sebagai pushdown predikat. Untuk mengaktifkannya, tentukan opsi lokasi manajer sumber daya Hadoop di CREATE EXTERNAL DATA SOURCE.

Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.

Kumpulan SQL tanpa server dan khusus di Azure Synapse Analytics menggunakan basis kode yang berbeda untuk virtualisasi data. Kumpulan SQL tanpa server mendukung teknologi virtualisasi data asli. Kumpulan SQL khusus mendukung virtualisasi data asli dan PolyBase. Virtualisasi data PolyBase digunakan saat EXTERNAL DATA SOURCE dibuat dengan TYPE=HADOOP.

Keterbatasan

Karena data untuk tabel eksternal tidak berada di bawah kontrol manajemen langsung Azure Synapse, data dapat diubah atau dihapus kapan saja oleh proses eksternal. Akibatnya, hasil kueri terhadap tabel eksternal tidak dijamin deterministik. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

Tabel eksternal tidak mendukung data sumber dengan kolatasi UTF-8. Jika data sumber Anda menggunakan kolatasi UTF-8, Anda harus secara eksplisit menetapkan kolatasi non-UTF-8 ke setiap kolom UTF-8 dalam CREATE EXTERNAL TABLE pernyataan. Gagal melakukannya menghasilkan pesan kesalahan yang mirip dengan output berikut:

Msg 105105, Level 16, State 1, Line 22
105105;No column collation was specified in external table definition and the collation of current database 'Latin1_General_100_CI_AS_SC_UTF8' is not supported for external tables of type 'HADOOP'. Please specify a supported collation in the column definition.

Jika kolatasi database tabel eksternal adalah UTF-8, pembuatan tabel gagal kecuali setiap kolom secara eksplisit ditentukan dengan kolatasi non-UTF-8 (misalnya, [UTF8_column] VARCHAR(128) COLLATE LATIN1_GENERAL_100_CI_AS_KS_WS NOT NULL).

Anda dapat membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda.

Hanya pernyataan Data Definition Language (DDL) ini yang diizinkan pada tabel eksternal:

  • CREATE TABLE dan DROP TABLE
  • CREATE STATISTICS dan DROP STATISTICS
  • CREATE VIEW dan DROP VIEW

Konstruksi dan operasi tidak didukung:

  • Batasan DEFAULT pada kolom tabel eksternal
  • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui
  • Masking data dinamis pada kolom tabel eksternal

Batasan kueri

Disarankan untuk tidak melebihi tidak lebih dari 30k file per folder. Ketika terlalu banyak file direferensikan, pengecualian kehabisan memori Java Virtual Machine (JVM) mungkin terjadi atau performa dapat menurun.

Batasan lebar tabel

PolyBase di Azure Data Warehouse memiliki batas lebar baris 1 MB berdasarkan ukuran maksimum satu baris yang valid menurut definisi tabel. Jika jumlah skema kolom lebih besar dari 1 MB, PolyBase tidak dapat mengkueri data.

Batasan jenis data

Tipe data berikut tidak dapat digunakan dalam tabel eksternal PolyBase:

  • geografi
  • geometri
  • hierarkis
  • gambar
  • teks
  • ntext
  • xml
  • Jenis yang ditentukan pengguna

Penguncian

Kunci bersama pada SCHEMARESOLUTION objek.

Contoh

J. Mengimpor Data dari ADLS Gen 2 ke Azure Synapse Analytics

Untuk contoh gen ADLS Gen 1, lihat Membuat sumber data eksternal.

-- These values come from your Azure Active Directory Application used to authenticate to ADLS Gen 2.
CREATE DATABASE SCOPED CREDENTIAL ADLUser
WITH
    IDENTITY = '<clientID>@\<OAuth2.0TokenEndPoint>',
    SECRET = '<KEY>';
GO

CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (
    TYPE = HADOOP,
    LOCATION = 'abfss://data@pbasetr.azuredatalakestore.net'
);
GO

CREATE EXTERNAL FILE FORMAT TextFileFormat
WITH (
    FORMAT_TYPE = DELIMITEDTEXT,
    FORMAT_OPTIONS (
        FIELD_TERMINATOR = '|',
        STRING_DELIMITER = '',
        DATE_FORMAT = 'yyyy-MM-dd HH:mm:ss.fff',
        USE_TYPE_DEFAULT = FALSE
    )
);
GO

CREATE EXTERNAL TABLE [dbo].[DimProduct_external]
(
    [ProductKey] INT NOT NULL,
    [ProductLabel] NVARCHAR NULL,
    [ProductName] NVARCHAR NULL
)
WITH (
    DATA_SOURCE = AzureDataLakeStore,
    LOCATION = '/DimProduct/',
    FILE_FORMAT = TextFileFormat,
    REJECT_TYPE = value,
    REJECT_VALUE = 0
);
GO

CREATE TABLE [dbo].[DimProduct]
WITH (DISTRIBUTION = HASH([ProductKey])) AS
GO

SELECT *
FROM [dbo].[DimProduct_external];

B. Mengimpor Data dari Parquet ke Azure Synapse Analytics

Berikut contoh membuat tabel eksternal. Kemudian mengembalikan baris pertama:

CREATE EXTERNAL TABLE census_external_table
(
    decennialTime VARCHAR (20),
    stateName VARCHAR (100),
    countyName VARCHAR (100),
    population INT,
    race VARCHAR (50),
    sex VARCHAR (10),
    minAge INT,
    maxAge INT
)
WITH (
    DATA_SOURCE = population_ds,
    LOCATION = '/parquet/',
    FILE_FORMAT = census_file_format
);
GO

SELECT TOP 1 *
FROM census_external_table;

*Analytics
Sistem Platform (PDW) *
 

 

Gambaran Umum: Sistem Platform Analitik

Gunakan tabel eksternal untuk:

  • Mengkueri Hadoop atau data Azure Blob Storage dengan pernyataan Transact-SQL.
  • Impor dan simpan data dari Hadoop atau Azure Blob Storage ke Dalam Sistem Platform Analitik.

Lihat juga MEMBUAT SUMBER DATA EKSTERNAL dan MENGHILANGKAN TABEL EKSTERNAL.

Sintaks

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ , ...n ] )
    WITH (
        LOCATION = 'hdfs_folder_or_filepath' ,
        DATA_SOURCE = external_data_source_name ,
        FILE_FORMAT = external_file_format_name
        [ , <reject_options> [ , ...n ] ]
    )
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

<reject_options> ::=
{
    | REJECT_TYPE = { value | percentage },
    | REJECT_VALUE = reject_value ,
    | REJECT_SAMPLE_VALUE = reject_sample_value ,

}

Argumen

{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Satu hingga tiga bagian nama tabel yang akan dibuat.

Untuk tabel eksternal, Sistem Platform Analitik hanya menyimpan metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk di Hadoop atau Azure Blob Storage. Tidak ada data aktual yang dipindahkan atau disimpan di Sistem Platform Analitik.

Penting

Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, Anda harus memberikan nama tiga bagian.

< > column_definition [ ,...n ]

CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak dapat menggunakan pada DEFAULT CONSTRAINT tabel eksternal.

Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file ditolak saat mengkueri data aktual.

LOCATION = 'folder_or_filepath'

Menentukan folder atau jalur file dan nama file untuk data aktual di Hadoop atau Azure Blob Storage. Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan dalam sumber data eksternal.

Di Sistem Platform Analitik, pernyataan CREATE EXTERNAL TABLE AS SELECT (CETAS) membuat jalur dan folder jika tidak ada. CREATE EXTERNAL TABLE tidak membuat jalur dan folder.

Jika Anda menentukan LOCATION untuk menjadi folder, kueri PolyBase yang memilih dari tabel eksternal mengambil file dari folder dan semua subfoldernya. Sama seperti Hadoop, PolyBase tidak mengembalikan folder tersembunyi. Ini juga tidak mengembalikan file yang nama filenya dimulai dengan garis bawah (_) atau titik (.).

Dalam contoh gambar berikut, jika LOCATION='/webdata/', kueri PolyBase mengembalikan baris dari mydata.txt dan mydata2.txt. Ini tidak kembali mydata3.txt karena berada di subfolder folder tersembunyi, dan tidak kembali _hidden.txt karena merupakan file tersembunyi.

Diagram folder dan data file untuk tabel eksternal.

Untuk mengubah default dan hanya membaca dari folder akar, atur atribut <polybase.recursive.traversal> ke 'false' dalam core-site.xml file konfigurasi. File ini terletak di bawah <SqlBinRoot>\PolyBase\Hadoop\Conf\bin akar SQL Server. Contohnya,C:\Program Files\Microsoft SQL Server\MSSQL13.XD14\MSSQL\Binn\.

DATA_SOURCE = external_data_source_name

Menentukan nama sumber data eksternal yang berisi lokasi data eksternal. Lokasi ini adalah Hadoop atau Azure Blob Storage. Untuk membuat sumber data eksternal, gunakan CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name

Menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

Opsi REJECT

Opsi ini hanya dapat digunakan dengan sumber data eksternal tempat TYPE = HADOOP.

Anda dapat menentukan parameter penolakan yang menentukan bagaimana PolyBase menangani rekaman kotor yang diambilnya dari sumber data eksternal. Rekaman data dianggap 'kotor' jika jenis data aktual atau jumlah kolom tidak cocok dengan definisi kolom tabel eksternal.

Saat Anda tidak menentukan atau mengubah nilai penolakan, PolyBase menggunakan nilai default. Informasi tentang parameter penolakan ini disimpan sebagai metadata tambahan saat Anda membuat tabel eksternal dengan CREATE EXTERNAL TABLE pernyataan. Saat pernyataan atau SELECT INTO SELECT pernyataan mendatang SELECT memilih data dari tabel eksternal, PolyBase menggunakan opsi penolakan untuk menentukan jumlah atau persentase baris yang dapat ditolak sebelum kueri aktual gagal. Kueri mengembalikan hasil (parsial) hingga ambang penolakan terlampaui. Kueri kemudian gagal dengan pesan kesalahan yang sesuai.

REJECT_TYPE = { value | percentage }

Mengklarifikasi apakah REJECT_VALUE opsi ditentukan sebagai nilai harfiah atau persentase.

  • nilai

    REJECT_VALUE adalah nilai harfiah, bukan persentase. Kueri PolyBase gagal ketika jumlah baris yang ditolak melebihi reject_value.

    Misalnya, jika REJECT_VALUE = 5 dan REJECT_TYPE = value, kueri PolyBase SELECT gagal setelah lima baris ditolak.

  • Persentase

    REJECT_VALUE adalah persentase, bukan nilai harfiah. Kueri PolyBase gagal ketika persentase baris yang gagal melebihi reject_value. Persentase baris yang gagal dihitung pada interval.

REJECT_VALUE = reject_value

Menentukan nilai atau persentase baris yang dapat ditolak sebelum kueri gagal.

Untuk REJECT_TYPE = value, reject_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.

Untuk REJECT_TYPE = percentage, reject_value harus berupa float antara 0 dan 100.

REJECT_SAMPLE_VALUE = reject_sample_value

Atribut ini diperlukan saat Anda menentukan REJECT_TYPE = percentage. Ini menentukan jumlah baris untuk mencoba mengambil sebelum PolyBase menghitung ulang persentase baris yang ditolak.

Parameter reject_sample_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.

Misalnya, jika REJECT_SAMPLE_VALUE = 1000, PolyBase menghitung persentase baris yang gagal setelah mencoba mengimpor 1.000 baris dari file data eksternal. Jika persentase baris yang gagal kurang dari reject_value, PolyBase mencoba mengambil 1.000 baris lainnya. Ini terus menghitung ulang persentase baris yang gagal setelah mencoba mengimpor setiap 1.000 baris tambahan.

Catatan

Karena PolyBase menghitung persentase baris yang gagal pada interval, persentase aktual baris yang gagal dapat melebihi reject_value.

Example

Contoh ini menunjukkan bagaimana tiga REJECT opsi berinteraksi satu sama lain. Misalnya, jika REJECT_TYPE = percentage, , REJECT_VALUE = 30dan REJECT_SAMPLE_VALUE = 100, skenario berikut dapat terjadi:

  • PolyBase mencoba mengambil 100 baris pertama; 25 gagal dan 75 berhasil.
  • Persentase baris yang gagal dihitung sebagai 25%, yang kurang dari nilai penolakan 30%. Akibatnya, PolyBase terus mengambil data dari sumber data eksternal.
  • PolyBase mencoba memuat 100 baris berikutnya; kali ini 25 baris berhasil dan 75 baris gagal.
  • Persentase baris yang gagal dihitung ulang sebagai 50%. Persentase baris yang gagal telah melebihi nilai penolakan 30%.
  • Kueri PolyBase gagal dengan 50% baris yang ditolak setelah mencoba mengembalikan 200 baris pertama. Baris yang cocok dikembalikan sebelum kueri PolyBase mendeteksi ambang penolakan telah terlampaui.

Izin

Memerlukan izin pengguna ini:

  • CREATE TABLE
  • ALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASE

Perhatikan, login yang membuat sumber data eksternal harus memiliki izin untuk membaca dan menulis ke sumber data eksternal, yang terletak di Hadoop atau Azure Blob Storage.

Penting

Izin ini ALTER ANY EXTERNAL DATA SOURCE memberikan kemampuan kepada perwakilan mana pun untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, ia juga memberikan kemampuan untuk mengakses semua kredensial cakupan database pada database. Izin ini harus dianggap sangat istimewa, dan oleh karena itu harus diberikan hanya kepada prinsipal tepercaya dalam sistem.

Penanganan kesalahan

Saat menjalankan pernyataan CREATE EXTERNAL TABLE, PolyBase mencoba menyambungkan ke sumber data eksternal. Jika upaya untuk menyambungkan gagal, pernyataan gagal dan tabel eksternal tidak dibuat. Diperlukan waktu satu menit atau lebih agar perintah gagal karena PolyBase mencoba kembali koneksi sebelum akhirnya gagal kueri.

Keterangan

Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, PolyBase menyimpan baris yang diambil dari sumber data eksternal dalam tabel sementara. Setelah kueri selesai, PolyBase menghapus dan menghapus tabel sementara. Tidak ada data permanen yang disimpan dalam tabel SQL.

Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, PolyBase menyimpan baris yang diambil dari sumber data eksternal sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat PolyBase mengambil data eksternal.

PolyBase dapat mendorong beberapa komputasi kueri ke Hadoop untuk meningkatkan performa kueri. Tindakan ini dikenal sebagai pushdown predikat. Untuk mengaktifkannya, tentukan opsi lokasi manajer sumber daya Hadoop di CREATE EXTERNAL DATA SOURCE.

Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.

Keterbatasan

Karena data untuk tabel eksternal tidak berada di bawah kontrol manajemen langsung appliance, data dapat diubah atau dihapus kapan saja oleh proses eksternal. Akibatnya, hasil kueri terhadap tabel eksternal tidak dijamin deterministik. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

Anda dapat membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda. Jika Anda secara bersamaan menjalankan kueri terhadap sumber data Hadoop yang berbeda, maka setiap sumber Hadoop harus menggunakan pengaturan konfigurasi server 'konektivitas hadoop' yang sama. Misalnya, Anda tidak dapat menjalankan kueri secara bersamaan terhadap kluster Cloudera Hadoop dan kluster Hortonworks Hadoop karena ini menggunakan pengaturan konfigurasi yang berbeda. Untuk pengaturan konfigurasi dan kombinasi yang didukung, lihat Konfigurasi konektivitas PolyBase.

Hanya pernyataan Data Definition Language (DDL) ini yang diizinkan pada tabel eksternal:

  • CREATE TABLE dan DROP TABLE
  • CREATE STATISTICS dan DROP STATISTICS
  • CREATE VIEW dan DROP VIEW

Konstruksi dan operasi tidak didukung:

  • Batasan DEFAULT pada kolom tabel eksternal
  • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui
  • Masking data dinamis pada kolom tabel eksternal

Batasan kueri

PolyBase dapat menggunakan maksimum 33k file per folder saat menjalankan 32 kueri PolyBase bersamaan. Jumlah maksimum ini mencakup file dan subfolder di setiap folder HDFS. Jika tingkat konkurensi kurang dari 32, pengguna dapat menjalankan kueri PolyBase terhadap folder dalam HDFS yang berisi lebih dari file 33k. Kami menyarankan agar Anda menjaga jalur file eksternal tetap pendek dan menggunakan tidak lebih dari 30k file per folder HDFS. Ketika terlalu banyak file direferensikan, pengecualian kehabisan memori Java Virtual Machine (JVM) mungkin terjadi.

Batasan lebar tabel

Di SQL Server 2016 (13.x), PolyBase memiliki batas lebar baris 32 KB berdasarkan ukuran maksimum satu baris yang valid menurut definisi tabel. Jika jumlah skema kolom lebih besar dari 32 KB, PolyBase tidak dapat mengkueri data.

Di Azure Synapse Analytics, batasan ini telah dinaikkan menjadi 1 MB.

Batasan jenis data

Tipe data berikut tidak dapat digunakan dalam tabel eksternal PolyBase:

  • geografi
  • geometri
  • hierarkis
  • gambar
  • teks
  • ntext
  • xml
  • Jenis yang ditentukan pengguna

Penguncian

Kunci bersama pada SCHEMARESOLUTION objek.

Keamanan

File data untuk tabel eksternal disimpan di Hadoop atau Azure Blob Storage. File data ini dibuat dan dikelola oleh proses Anda sendiri. Anda bertanggung jawab untuk mengelola keamanan data eksternal.

Contoh

J. Menggabungkan data HDFS dengan data Sistem Platform Analitik

SELECT cs.user_ip
FROM ClickStream AS cs
     INNER JOIN [User] AS u
         ON cs.user_ip = u.user_ip
WHERE cs.url = 'www.microsoft.com';

B. Mengimpor data baris dari HDFS ke dalam Tabel Sistem Platform Analitik terdistribusi

CREATE TABLE ClickStream_PDW
WITH (DISTRIBUTION = HASH(url)) AS
SELECT url,
       event_date,
       user_ip
FROM ClickStream;

C. Mengimpor data baris dari HDFS ke dalam Tabel Sistem Platform Analitik yang direplikasi

CREATE TABLE ClickStream_PDW
WITH (DISTRIBUTION = REPLICATE) AS
SELECT url,
       event_date,
       user_ip
FROM ClickStream;

* Azure SQL Managed Instance *  

 

Gambaran Umum: Azure SQL Managed Instance

Membuat tabel data eksternal di Azure SQL Managed Instance. Untuk informasi lengkap, lihat Virtualisasi data dengan Azure SQL Managed Instance.

Virtualisasi data di Azure SQL Managed Instance menyediakan akses ke data eksternal dalam beberapa format file di Azure Data Lake Storage Gen2 atau Azure Blob Storage, dan untuk mengkuerinya dengan pernyataan T-SQL, bahkan menggabungkan data dengan data relasional yang disimpan secara lokal menggunakan gabungan.

Lihat juga MEMBUAT SUMBER DATA EKSTERNAL dan MENGHILANGKAN TABEL EKSTERNAL.

Sintaks

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ , ...n ] )
    WITH (
        LOCATION = 'filepath' ,
        DATA_SOURCE = external_data_source_name ,
        FILE_FORMAT = external_file_format_name
    )
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

Argumen

{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Satu hingga tiga bagian nama tabel yang akan dibuat.

Untuk tabel eksternal, hanya metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk di Azure Data Lake atau Azure Blob Storage. Tidak ada data aktual yang dipindahkan atau disimpan saat tabel eksternal dibuat.

Penting

Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, Anda harus memberikan nama tiga bagian.

< > column_definition [ ,...n ]

CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak dapat menggunakan pada DEFAULT CONSTRAINT tabel eksternal.

Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file ditolak saat mengkueri data aktual.

LOCATION = 'folder_or_filepath'

Menentukan folder atau jalur file dan nama file untuk data aktual di Azure Data Lake atau Azure Blob Storage. Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan dalam sumber data eksternal. CREATE EXTERNAL TABLE tidak membuat jalur dan folder.

Jika Anda menentukan LOCATION untuk menjadi folder, kueri dari Azure SQL Managed Instance yang memilih dari tabel eksternal mengambil file dari folder tetapi tidak semua subfoldernya.

Azure SQL Managed Instance tidak dapat menemukan file di subfolder atau folder tersembunyi. Ini juga tidak mengembalikan file yang nama filenya dimulai dengan garis bawah (_) atau titik (.).

Dalam contoh gambar berikut, jika LOCATION='/webdata/', kueri mengembalikan baris dari mydata.txt. Ini tidak kembali mydata2.txt karena berada di subfolder, itu tidak kembali mydata3.txt karena berada di folder tersembunyi, dan tidak kembali _hidden.txt karena itu adalah file tersembunyi.

Diagram folder dan data file untuk tabel eksternal.

DATA_SOURCE = external_data_source_name

Menentukan nama sumber data eksternal yang berisi lokasi data eksternal. Lokasi ini berada di Azure Data Lake. Untuk membuat sumber data eksternal, gunakan CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name

Menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

Izin

Memerlukan izin pengguna ini:

  • CREATE TABLE
  • ALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASE izin diperlukan untuk hanya membuat kunci master, kredensial cakupan database, dan sumber data eksternal.

Perhatikan, login yang membuat sumber data eksternal harus memiliki izin untuk membaca dan menulis ke sumber data eksternal, yang terletak di Hadoop atau Azure Blob Storage.

Penting

Izin ini ALTER ANY EXTERNAL DATA SOURCE memberikan kemampuan kepada perwakilan mana pun untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, ia juga memberikan kemampuan untuk mengakses semua kredensial cakupan database pada database. Izin ini harus dianggap sangat istimewa, dan oleh karena itu harus diberikan hanya kepada prinsipal tepercaya dalam sistem.

Keterangan

Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, baris yang diambil dari sumber data eksternal disimpan dalam tabel sementara. Setelah kueri selesai, baris dihapus dan tabel sementara dihapus. Tidak ada data permanen yang disimpan dalam tabel SQL.

Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, baris yang diambil dari sumber data eksternal disimpan sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat data eksternal diambil.

Saat ini, virtualisasi data dengan Azure SQL Managed Instance bersifat baca-saja.

Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.

Keterbatasan

Karena data untuk tabel eksternal tidak berada di bawah kontrol manajemen langsung Azure SQL Managed Instance, data dapat diubah atau dihapus kapan saja oleh proses eksternal. Akibatnya, hasil kueri terhadap tabel eksternal tidak dijamin deterministik. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

Anda dapat membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda.

Hanya pernyataan Data Definition Language (DDL) ini yang diizinkan pada tabel eksternal:

  • CREATE TABLE dan DROP TABLE
  • CREATE STATISTICS dan DROP STATISTICS
  • CREATE VIEW dan DROP VIEW

Konstruksi dan operasi tidak didukung:

  • Batasan DEFAULT pada kolom tabel eksternal
  • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui

Batasan lebar tabel

Batas lebar baris 1 MB didasarkan pada ukuran maksimum satu baris yang valid menurut definisi tabel. Jika jumlah skema kolom lebih besar dari 1 MB, kueri virtualisasi data gagal.

Batasan jenis data

Jenis data berikut tidak dapat digunakan dalam tabel eksternal di Azure SQL Managed Instance:

  • geografi
  • geometri
  • hierarkis
  • gambar
  • teks
  • ntext
  • xml
  • json
  • Jenis yang ditentukan pengguna

Penguncian

Kunci bersama pada SCHEMARESOLUTION objek.

Contoh

J. Mengkueri data eksternal dari Azure SQL Managed Instance dengan tabel eksternal

Untuk contoh selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL atau lihat Virtualisasi data dengan Azure SQL Managed Instance.

  1. Buat kunci master database, jika tidak ada.

    -- Optional: Create MASTER KEY if it doesn't exist in the database:
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
    
  2. Buat kredensial cakupan database menggunakan token SAS. Anda juga dapat menggunakan identitas terkelola.

    CREATE DATABASE SCOPED CREDENTIAL MyCredential
    WITH
        IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = '<KEY>'; --Removing leading '?'
    
  3. Buat sumber data eksternal menggunakan kredensial.

    --Create external data source pointing to the file path, and referencing database-scoped credential:
    CREATE EXTERNAL DATA SOURCE MyPrivateExternalDataSource
    WITH (
        LOCATION = 'abs://public@pandemicdatalake.blob.core.windows.net/curated/covid-19/bing_covid-19_data/latest'
        CREDENTIAL = [MyCredential]
    );
    
  4. EXTERNAL FILE FORMAT Buat dan EXTERNAL TABLE, untuk mengkueri data seolah-olah itu adalah tabel lokal.

    -- Or, create an EXTERNAL FILE FORMAT and an EXTERNAL TABLE
    
    --Create external file format
    CREATE EXTERNAL FILE FORMAT DemoFileFormat
    WITH (
        FORMAT_TYPE = PARQUET
    );
    
    --Create external table:
    CREATE EXTERNAL TABLE tbl_TaxiRides
    (
        vendorID VARCHAR (100) COLLATE Latin1_General_BIN2,
        tpepPickupDateTime DATETIME2,
        tpepDropoffDateTime DATETIME2,
        passengerCount INT,
        tripDistance FLOAT,
        puLocationId VARCHAR (8000),
        doLocationId VARCHAR (8000),
        startLon FLOAT,
        startLat FLOAT,
        endLon FLOAT,
        endLat FLOAT,
        rateCodeId SMALLINT,
        storeAndFwdFlag VARCHAR (8000),
        paymentType VARCHAR (8000),
        fareAmount FLOAT,
        extra FLOAT,
        mtaTax FLOAT,
        improvementSurcharge VARCHAR (8000),
        tipAmount FLOAT,
        tollsAmount FLOAT,
        totalAmount FLOAT
    )
    WITH (
        DATA_SOURCE = NYCTaxiExternalDataSource,
        LOCATION = 'yellow/puYear = */puMonth = */*.parquet',
        FILE_FORMAT = MyFileFormat
    );
    
    --Then, query the data via an external table with T-SQL:
    SELECT TOP 10 *
    FROM tbl_TaxiRides;
    

Pelajari selengkapnya tentang tabel eksternal dan konsep terkait dalam artikel berikut ini:

 

Gambaran Umum: Microsoft Fabric

Berlaku untuk: Microsoft Fabric Data Warehouse

Untuk informasi dan contoh selengkapnya untuk OPENROWSET di Fabric Data Warehouse, lihat:

* Basis data Fabric SQL *  

 

Gambaran Umum: Database SQL di Microsoft Fabric

Membuat tabel eksternal.

Untuk digunakan dengan Virtualisasi data (pratinjau).

Sintaks

CREATE EXTERNAL TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
    ( <column_definition> [ , ...n ] )
    WITH (
        LOCATION = 'filepath' ,
        DATA_SOURCE = external_data_source_name ,
        FILE_FORMAT = external_file_format_name
    )
[ ; ]

<column_definition> ::=
column_name <data_type>
    [ COLLATE collation_name ]
    [ NULL | NOT NULL ]

Argumen

{ database_name.schema_name.table_name | schema_name.table_name | table_name }

Satu hingga tiga bagian nama tabel yang akan dibuat.

Untuk tabel eksternal, SQL hanya menyimpan metadata tabel bersama dengan statistik dasar tentang file atau folder. Tidak ada data aktual yang dipindahkan atau disimpan dalam database SQL di Fabric saat tabel eksternal dibuat.

Penting

Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, Anda harus memberikan nama tiga bagian.

< > column_definition [ ,...n ]

CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak dapat menggunakan pada DEFAULT CONSTRAINT tabel eksternal. Jenis data ini tidak didukung untuk kolom dalam tabel eksternal:

  • geografi
  • geometri
  • hierarkis
  • gambar
  • teks
  • ntext
  • xml
  • json
  • Jenis yang ditentukan pengguna

Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file ditolak saat mengkueri data aktual.

LOCATION = 'folder_or_filepath'

Menentukan folder atau jalur file dan nama file untuk data aktual di OneLake di Microsoft Fabric.

Sumber_Data

DATA_SOURCE menentukan nama sumber data eksternal yang berisi lokasi data eksternal. Untuk membuat sumber data eksternal, gunakan CREATE EXTERNAL DATA SOURCE.

FILE_FORMAT = external_file_format_name

Menentukan nama objek format file eksternal yang menyimpan jenis file dan metode kompresi untuk data eksternal. Untuk membuat format file eksternal, gunakan CREATE EXTERNAL FILE FORMAT.

Izin

Pengguna dengan akses ke tabel eksternal secara otomatis akan mendapatkan akses ke tabel jarak jauh yang mendasarinya di bawah info masuk yang diberikan dalam definisi sumber data eksternal. Hindari elevasi melalui info masuk sumber data eksternal. Gunakan GRANT atau REVOKE untuk tabel eksternal seolah-olah tabel biasa. Setelah menentukan sumber data eksternal dan tabel eksternal Anda, sekarang Anda dapat menggunakan T-SQL lengkap di atas tabel eksternal.

CREATE EXTERNAL TABLE memerlukan izin pengguna ini:

  • CREATE TABLE
  • ALTER ANY SCHEMA
  • ALTER ANY EXTERNAL DATA SOURCE
  • ALTER ANY EXTERNAL FILE FORMAT
  • CONTROL DATABASE izin diperlukan untuk hanya membuat kunci master, kredensial cakupan database, dan sumber data eksternal.

Login yang membuat sumber data eksternal harus memiliki izin untuk membaca dan menulis ke sumber data eksternal, yang terletak di Hadoop atau Azure Blob Storage.

Penting

Izin ini ALTER ANY EXTERNAL DATA SOURCE memberikan kemampuan kepada perwakilan mana pun untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, ia juga memberikan kemampuan untuk mengakses semua kredensial cakupan database pada database. Izin ini harus dianggap sangat istimewa, dan oleh karena itu harus diberikan hanya kepada prinsipal tepercaya dalam sistem.

Penguncian

Kunci bersama pada SCHEMARESOLUTION objek.

Keterangan

Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, baris yang diambil dari sumber data eksternal disimpan dalam tabel sementara. Setelah kueri selesai, baris dihapus dan tabel sementara dihapus. Tidak ada data permanen yang disimpan dalam tabel SQL.

Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, baris yang diambil dari sumber data eksternal disimpan sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat data eksternal diambil.

Database Fabric SQL hanya mendukung OneLake di Microsoft Fabric sebagai sumber data.

Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.

Batasan lebar tabel

Batas lebar baris 1 MB didasarkan pada ukuran maksimum satu baris yang valid menurut definisi tabel. Jika jumlah skema kolom lebih besar dari 1 MB, kueri virtualisasi data gagal.

Penanganan kesalahan

Saat menjalankan CREATE EXTERNAL TABLE pernyataan, jika upaya untuk menyambungkan gagal, pernyataan gagal dan tabel eksternal tidak dibuat. Diperlukan waktu satu menit atau lebih agar perintah gagal karena SQL Database mencoba kembali koneksi sebelum akhirnya gagal kueri.

Keterbatasan

Saat ini saat membuat Tabel Eksternal yang menunjuk ke file CSV di database Fabric SQL, Anda harus menyediakan skema tabel, misalnya: SELECT * FROM [schema].[table_name]. Jika tidak, pesan kesalahan berikut ditampilkan:

Msg 208, Level 16, State 160, Line 1: Invalid object name 'SQLdatabase-id'

Karena data untuk tabel eksternal tidak berada di bawah kontrol manajemen langsung Mesin Database, data dapat diubah atau dihapus kapan saja oleh proses eksternal. Akibatnya, hasil kueri terhadap tabel eksternal tidak dijamin deterministik. Kueri yang sama dapat mengembalikan hasil yang berbeda setiap kali dijalankan terhadap tabel eksternal. Demikian pula, kueri mungkin gagal jika data eksternal dipindahkan atau dihapus.

Anda dapat membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda.

Hanya pernyataan Data Definition Language (DDL) ini yang diizinkan pada tabel eksternal:

  • CREATE TABLE dan DROP TABLE
  • CREATE STATISTICS dan DROP STATISTICS
  • CREATE VIEW dan DROP VIEW

Konstruksi dan operasi tidak didukung:

  • Batasan DEFAULT pada kolom tabel eksternal.
  • Operasi Data Manipulation Language (DML) dari hapus, sisipkan, dan perbarui.

Contoh

J. Membuat tabel eksternal yang menargetkan file Parquet yang tersedia di OneLake di Microsoft Fabric

CREATE EXTERNAL DATA SOURCE [MainLakeHouse]
WITH (
    LOCATION = 'abfss://<WorkspaceID>@<tenant>.dfs.fabric.microsoft.com/<Lakehouse_id'
);
GO

CREATE EXTERNAL FILE FORMAT [Parquetff]
WITH (
    FORMAT_TYPE = PARQUET
);
GO

CREATE EXTERNAL TABLE Customer_parquet
(
    CustomerKey INT,
    GeoAreaKey INT,
    StartDT DATETIME2,
    EndDT DATETIME2,
    Continent NVARCHAR (50),
    Gender NVARCHAR (10),
    Title NVARCHAR (10),
    GivenName NVARCHAR (100),
    MiddleInitial VARCHAR (2),
    Surname NVARCHAR (100),
    StreetAddress NVARCHAR (200),
    City NVARCHAR (100),
    State NVARCHAR (100),
    StateFull NVARCHAR (100),
    ZipCode NVARCHAR (20),
    Country_Region NCHAR (2),
    CountryFull NVARCHAR (100),
    Birthday DATETIME2,
    Age INT,
    Occupation NVARCHAR (100),
    Company NVARCHAR (100),
    Vehicle NVARCHAR (100),
    Latitude DECIMAL (10, 6),
    Longitude DECIMAL (10, 6)
)
WITH (
    DATA_SOURCE = MainLakeHouse,
    LOCATION = '/Files/parquet/customer.parquet',
    FILE_FORMAT = [parquetff]
);
GO

SELECT *
FROM Customer_parquet;