BUAT TABEL EKSTERNAL (Transact-SQL)
Membuat tabel eksternal.
Artikel ini menyediakan sintaks, argumen, keterangan, izin, dan contoh untuk produk SQL mana pun yang Anda pilih.
Untuk informasi selengkapnya tentang konvensi sintaks, lihat Konvensi sintaks transact-SQL.
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 (atau lebih tinggi)
Gunakan tabel eksternal dengan sumber data eksternal untuk kueri PolyBase. Sumber data eksternal digunakan untuk membangun konektivitas dan mendukung kasus penggunaan utama ini:
- Virtualisasi data dan pemuatan data menggunakan PolyBase
- Operasi pemuatan massal menggunakan SQL Server atau SQL Database menggunakan
BULK INSERT
atauOPENROWSET
Lihat juga MEMBUAT SUMBER DATA EKSTERNAL dan MENGHILANGKAN TABEL EKSTERNAL.
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, sangat disarankan untuk memberikan nama tiga bagian.
<> column_definition [ ,...n ]
CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak bisa menggunakan DEFAULT CONSTRAINT pada tabel eksternal.
Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file akan 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 Kueri PolyBase.
Jika Anda menentukan LOCATION menjadi folder, kueri PolyBase yang memilih dari tabel eksternal akan 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 akan mengembalikan baris dari mydata.txt
dan mydata2.txt
. Ini tidak akan kembali mydata3.txt
karena merupakan file dalam subfolder tersembunyi. Dan itu tidak akan kembali _hidden.txt
karena itu adalah file tersembunyi.
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\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 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 Penolakan
Opsi ini hanya dapat digunakan dengan sumber data eksternal di mana TYPE = HADOOP.
Anda dapat menentukan parameter penolakan yang menentukan bagaimana PolyBase akan 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 pernyataan CREATE EXTERNAL TABLE. Saat pernyataan SELECT mendatang atau pernyataan SELECT INTO SELECT memilih data dari tabel eksternal, PolyBase akan menggunakan opsi penolakan untuk menentukan jumlah atau persentase baris yang dapat ditolak sebelum kueri aktual gagal. Kueri akan menampilkan hasil (parsial) sampai ambang penolakan terlampaui. Kueri kemudian gagal dengan pesan kesalahan yang sesuai.
REJECT_TYPE = nilai | Persentase
Mengklarifikasi apakah opsi REJECT_VALUE ditentukan sebagai nilai harfiah atau persentase.
value
REJECT_VALUE adalah nilai harfiah, bukan persentase. Kueri akan gagal ketika jumlah baris yang ditolak melebihi reject_value.
Misalnya, jika REJECT_VALUE = 5
dan REJECT_TYPE = value
, kueri SELECT akan gagal setelah lima baris ditolak.
Persentase
REJECT_VALUE adalah persentase, bukan nilai harfiah. Kueri akan 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 = nilai, reject_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.
Untuk REJECT_TYPE = persentase, reject_value harus berupa float antara 0 dan 100.
REJECT_SAMPLE_VALUE = reject_sample_value
Atribut ini diperlukan saat Anda menentukan REJECT_TYPE = persentase. 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 akan menghitung persentase baris yang gagal setelah mencoba mengimpor 1000 baris dari file data eksternal. Jika persentase baris yang gagal kurang dari reject_value, PolyBase akan mencoba mengambil 1000 baris lainnya. Ini terus menghitung ulang persentase baris yang gagal setelah mencoba mengimpor setiap 1000 baris tambahan.
Catatan
Karena PolyBase menghitung persentase baris yang gagal pada interval, persentase aktual baris yang gagal dapat melebihi reject_value.
Contoh:
Contoh ini menunjukkan bagaimana tiga opsi REJECT berinteraksi satu sama lain. Misalnya, jika REJECT_TYPE = persentase, REJECT_VALUE = 30, dan 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 akan 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. Perhatikan bahwa baris yang cocok telah dikembalikan sebelum kueri PolyBase mendeteksi ambang penolakan telah terlampaui.
REJECTED_ROW_LOCATION = Lokasi Direktori
Berlaku untuk: SQL Server 2019 CU6 dan versi yang lebih baru, 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, file _reason dan file data. Opsi ini hanya dapat digunakan dengan sumber data eksternal di mana TYPE = HADOOP dan untuk tabel eksternal menggunakan DELIMITEDTEXT FORMAT_TYPE. Untuk informasi selengkapnya, lihat MEMBUAT SUMBER DATA EKSTERNAL dan MEMBUAT FORMAT FILE 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.
Izin
Memerlukan izin pengguna ini:
- CREATE TABLE
- ALTER ANY SCHEMA
- ALTER ANY EXTERNAL DATA SOURCE
- UBAH FORMAT FILE EKSTERNAL APA PUN (hanya berlaku untuk hadoop dan sumber data eksternal Azure Storage)
- CONTROL DATABASE (hanya berlaku untuk hadoop dan sumber data eksternal Azure Storage)
Catatan, login jarak jauh yang ditentukan dalam DATABASE SCOPED CREDENTIAL yang digunakan dalam perintah CREATE EXTERNAL TABLE harus memiliki izin baca untuk jalur/tabel/koleksi pada sumber data eksternal yang ditentukan dalam parameter LOCATION. Jika Anda berencana menggunakan TABEL EKSTERNAL ini untuk mengekspor data ke sumber data eksternal Hadoop atau Azure Storage, maka login yang ditentukan harus memiliki izin tulis pada jalur yang ditentukan di LOCATION. Perhatikan bahwa Hadoop saat ini 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 UBAH SUMBER DATA EKSTERNAL apa pun memberi prinsipal kemampuan 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 akan gagal dan tabel eksternal tidak akan 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 disebut 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.
Pembatasan dan batasan
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
, PARQUET
atau 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:
- BUAT TABEL dan LETAKKAN TABEL
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- BUAT TAMPILAN dan JATUHKAN TAMPILAN
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
PolyBase di SQL Server 2016 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:
geography
geometry
hierarchyid
image
text
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
Untuk membuat tabel eksternal ke koleksi MongoDB yang berisi array, Anda harus menggunakan ekstensi Virtualisasi Data untuk Azure Data Studio untuk menghasilkan pernyataan CREATE EXTERNAL TABLE berdasarkan skema yang terdeteksi oleh Driver ODBC PolyBase untuk MongoDB. Tindakan meratakan dilakukan secara otomatis oleh driver. Atau, Anda dapat menggunakan sp_data_source_objects (Transact-SQL) untuk mendeteksi skema koleksi (kolom) dan membuat tabel eksternal secara manual. Prosedur sp_data_source_table_columns
tersimpan juga secara otomatis melakukan meratakan melalui Driver ODBC PolyBase untuk driver MongoDB. Ekstensi Virtualisasi Data untuk Azure Data Studio dan sp_data_source_table_columns
gunakan prosedur tersimpan internal yang sama untuk mengkueri skema eksternal.
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
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 sumber data eksternal mydatasource 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'
)
CREATE EXTERNAL FILE FORMAT myfileformat
WITH (
FORMAT_TYPE = DELIMITEDTEXT,
FORMAT_OPTIONS (FIELD_TERMINATOR ='|')
);
CREATE EXTERNAL TABLE ClickStream (
url varchar(50),
event_date date,
user_IP varchar(50)
)
WITH (
LOCATION='/webdata/employee.tbl',
DATA_SOURCE = mydatasource,
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'
)
CREATE EXTERNAL FILE FORMAT myfileformat_rc
WITH (
FORMAT_TYPE = RCFILE,
SERDE_METHOD = 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
)
;
CREATE EXTERNAL TABLE ClickStream_rc (
url varchar(50),
event_date date,
user_ip varchar(50)
)
WITH (
LOCATION='/webdata/employee_rc.tbl',
DATA_SOURCE = mydatasource_rc,
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'
)
CREATE EXTERNAL FILE FORMAT myfileformat_orc
WITH (
FORMAT = ORC,
COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
)
;
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 JOIN standar 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 cs
JOIN UrlDescription 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 ClickStream
eksternal .
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 = 'S0me!nfo';
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';
GO
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;
GO
/* 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
);
I. Membuat tabel eksternal untuk Oracle
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
/*
* 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';
/*
* 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. Note 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 (
LOCATION='DB1.mySchema.customer',
DATA_SOURCE= external_data_source_name
);
j. Membuat tabel eksternal untuk Teradata
-- Create a Master Key
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
/*
* 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';
/* 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
);
/* 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';
/*
* 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';
/* 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 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);
GO
Langkah berikutnya
Pelajari selengkapnya tentang konsep terkait dalam artikel berikut:
* Azure SQL Database *
Gambaran Umum: Azure SQL Database
Di Azure SQL Database, membuat tabel eksternal untuk kueri elastis (dalam pratinjau).
Lihat juga MEMBUAT SUMBER DATA EKSTERNAL.
Sintaks
-- 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.
Penting
Untuk performa terbaik, jika driver sumber data eksternal mendukung nama tiga bagian, sangat disarankan untuk memberikan nama tiga bagian.
<> column_definition [ ,...n ]
CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak bisa menggunakan DEFAULT CONSTRAINT pada tabel eksternal.
Catatan
Text
, nText
dan XML
tidak didukung tipe data untuk kolom dalam tabel eksternal untuk Azure SQL Database.
Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file akan 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.
DATA_SOURCE
Klausa DATA_SOURCE mendefinisikan sumber data eksternal (peta pecahan) yang digunakan untuk tabel eksternal. Misalnya, lihat Membuat tabel eksternal.
Penting
Azure SQL Database mendukung pembuatan tabel eksternal ke RDMS tipe SUMBER DATA EKSTERNAL dan SHARD_MAP_MANAGER. Azure SQL Database tidak mendukung pembuatan tabel eksternal ke Azure Blob Storage.
SCHEMA_NAME dan OBJECT_NAME
Klausa SCHEMA_NAME dan OBJECT_NAME memetakan definisi tabel eksternal ke tabel dalam skema yang berbeda. Jika dihilangkan, skema objek jarak jauh diasumsikan sebagai "dbo" 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 nama mereka untuk definisi tabel eksternal. Sebagai gantinya, gunakan nama yang berbeda dan gunakan tampilan katalog atau nama DMV dalam klausa SCHEMA_NAME dan/atau OBJECT_NAME. Misalnya, lihat Membuat tabel eksternal.
DISTRIBUSI
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 tabel SHARDED (nama kolom), 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 klausa DISTRIBUTION untuk menyusun 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 salinan tabel yang identik ada di setiap database. Anda bertanggung jawab untuk memastikan bahwa replika identik di seluruh database.
- ROUND_ROBIN berarti 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 CABUT untuk tabel eksternal seolah-olah itu adalah tabel biasa. Setelah menentukan sumber data eksternal dan tabel eksternal Anda, sekarang Anda dapat menggunakan T-SQL lengkap di atas tabel eksternal.
Penanganan kesalahan
Saat menjalankan pernyataan CREATE EXTERNAL TABLE, jika upaya untuk menyambungkan gagal, pernyataan akan gagal dan tabel eksternal tidak akan dibuat. Diperlukan waktu satu menit atau lebih agar perintah gagal karena SQL Database mencoba kembali koneksi sebelum akhirnya gagal kueri.
Keterangan
Dalam skenario kueri ad hoc, seperti SELECT FROM EXTERNAL TABLE, SQL Database menyimpan baris yang diambil dari sumber data eksternal dalam tabel sementara. Setelah kueri selesai, SQL Database menghapus dan menghapus tabel sementara. Tidak ada data permanen yang disimpan dalam tabel SQL.
Sebaliknya, dalam skenario impor, seperti SELECT INTO FROM EXTERNAL TABLE, SQL Database menyimpan baris yang diambil dari sumber data eksternal sebagai data permanen dalam tabel SQL. Tabel baru dibuat selama eksekusi kueri saat SQL Database mengambil data eksternal.
Anda dapat membuat banyak tabel eksternal yang mereferensikan sumber data eksternal yang sama atau berbeda.
Pembatasan dan batasan
Akses ke data melalui tabel eksternal tidak mematuhi semantik isolasi dalam SQL Server. Ini berarti bahwa mengkueri eksternal tidak memberlakukan penguncian atau isolasi rekam jepret apa pun dan dengan demikian 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.
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:
- BUAT TABEL dan LETAKKAN TABEL.
- BUAT TAMPILAN DAN JATUHKAN TAMPILAN.
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 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 bersama dengan perulangan berlapis dalam rencana kueri. Ini akan sering menyebabkan seluruh tabel eksternal disalin secara lokal dan kemudian digabungkan.
-- Assuming External.Orders is an external table and Customer is a local table.
-- This query will copy the whole of the external locally as the predicate needed
-- to filter isn't known at compile time. Its only known during execution of the query
SELECT Orders.OrderId, Orders.OrderTotal
FROM External.Orders
WHERE CustomerId IN (
SELECT TOP 1 CustomerId
FROM Customer
WHERE CustomerName = 'MyCompany'
);
Penggunaan tabel eksternal mencegah penggunaan paralelisme dalam rencana kueri.
Tabel eksternal diimplementasikan sebagai Kueri Jarak Jauh dan dengan demikian perkiraan jumlah baris yang dikembalikan umumnya adalah 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.
Batasan jenis data
Tipe data berikut tidak dapat digunakan dalam tabel eksternal PolyBase:
geography
geometry
hierarchyid
image
text
nText
xml
- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
Contoh
J. Membuat tabel eksternal untuk Azure SQL Database
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 klausa SCHEMA_NAME 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
);
Langkah berikutnya
Pelajari selengkapnya tentang tabel eksternal di Azure SQL Database dalam artikel berikut ini:
* 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, Azure Data Lake Storage Gen1, dan Gen2. Tanpa server tidak mendukung
TYPE=Hadoop
.
Lihat juga MEMBUAT SUMBER DATA EKSTERNAL dan MENGHILANGKAN TABEL EKSTERNAL.
Untuk panduan 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, sangat disarankan untuk memberikan nama tiga bagian.
<> column_definition [ ,...n ]
CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak bisa menggunakan DEFAULT CONSTRAINT pada tabel eksternal.
Catatan
Jenis text
data yang tidak digunakan lagi , 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 akan 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 membuat jalur dan folder jika tidak ada. CREATE EXTERNAL TABLE
tidak membuat jalur dan folder.
Jika Anda menentukan LOCATION menjadi folder, kueri PolyBase yang memilih dari tabel eksternal akan 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 akan mengembalikan baris dari mydata.txt
dan mydata2.txt
. Ini tidak akan kembali mydata3.txt
karena berada di subfolder folder tersembunyi. Dan itu tidak akan kembali _hidden.txt
karena itu adalah file tersembunyi.
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, akan mengembalikan baris dari mydata.txt. Ini tidak akan mengembalikan mydata2.txt dan mydata3.txt karena keduanya terletak di subfolder. Tabel Hadoop akan menampilkan semua file dalam subfolder apa pun.
Hadoop dan tabel eksternal asli akan 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.
TABLE_OPTIONS
Menentukan kumpulan opsi yang menjelaskan cara membaca file yang mendasar. Saat ini, satu-satunya opsi yang tersedia adalah {"READ_OPTIONS":["ALLOW_INCONSISTENT_READS"]}
, yang menginstruksikan tabel eksternal untuk mengabaikan pembaruan yang dibuat pada file dasar, 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 di mana TYPE = HADOOP.
Anda dapat menentukan parameter penolakan yang menentukan bagaimana PolyBase akan 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 pernyataan CREATE EXTERNAL TABLE. Saat pernyataan SELECT mendatang atau pernyataan SELECT INTO SELECT memilih data dari tabel eksternal, PolyBase akan menggunakan opsi penolakan untuk menentukan jumlah atau persentase baris yang dapat ditolak sebelum kueri aktual gagal. Kueri akan menampilkan hasil (parsial) sampai ambang penolakan terlampaui. Kueri kemudian gagal dengan pesan kesalahan yang sesuai.
Opsi format PARSER_VERSION hanya didukung di kumpulan SQL tanpa server.
REJECT_TYPE = nilai | Persentase
Mengklarifikasi apakah opsi REJECT_VALUE ditentukan sebagai nilai harfiah atau persentase.
value
REJECT_VALUE adalah nilai harfiah, bukan persentase. Kueri PolyBase akan gagal ketika jumlah baris yang ditolak melebihi reject_value.
Misalnya, jika REJECT_VALUE = 5 dan REJECT_TYPE = nilai, kueri PolyBase SELECT akan gagal setelah lima baris ditolak.
Persentase
REJECT_VALUE adalah persentase, bukan nilai harfiah. Kueri PolyBase akan 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 = nilai, reject_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.
- Untuk REJECT_TYPE = persentase, reject_value harus berupa float antara 0 dan 100. Persentase hanya berlaku untuk kumpulan SQL khusus di mana
TYPE=HADOOP
.
Kueri akan gagal ketika jumlah baris yang ditolak melebihi reject_value. Misalnya, jika REJECT_VALUE = 5 dan REJECT_TYPE = nilai, kueri SELECT akan gagal setelah lima baris ditolak.
REJECT_SAMPLE_VALUE = reject_sample_value
Atribut ini diperlukan saat Anda menentukan REJECT_TYPE = persentase. 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 akan menghitung persentase baris yang gagal setelah mencoba mengimpor 1000 baris dari file data eksternal. Jika persentase baris yang gagal kurang dari reject_value, PolyBase akan mencoba mengambil 1000 baris lainnya. Ini terus menghitung ulang persentase baris yang gagal setelah mencoba mengimpor setiap 1000 baris tambahan.
Catatan
Karena PolyBase menghitung persentase baris yang gagal pada interval, persentase aktual baris yang gagal dapat melebihi reject_value.
Contoh:
Contoh ini menunjukkan bagaimana tiga opsi REJECT berinteraksi satu sama lain. Misalnya, jika REJECT_TYPE = persentase, REJECT_VALUE = 30, dan 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 akan 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. Perhatikan bahwa baris yang cocok telah 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 id pernyataan untuk menghubungkan folder dengan kueri yang menghasilkannya. - Dalam kumpulan SQL khusus, jalur yang dibuat didasarkan pada waktu pengiriman beban dalam format
YearMonthDay -HourMinuteSecond
, misalnya20180330-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 |
---|---|
Kesalahan | Alasan mengapa baris ditolak. |
Baris | Nomor ordinal baris yang ditolak dalam file. |
Kolom | Nomor ordinal kolom yang ditolak. |
Nilai | Nilai kolom yang ditolak. Jika nilainya lebih besar dari 100 karakter, hanya 100 karakter pertama yang akan 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
Catatan
Izin CONTROL DATABASE diperlukan untuk membuat KUNCI MASTER saja, 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 UBAH SUMBER DATA EKSTERNAL apa pun memberi prinsipal kemampuan 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 akan gagal dan tabel eksternal tidak akan 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 disebut 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.
Perhatikan data sumber menggunakan kolatasi UTF-8. Untuk data sumber apa pun yang menggunakan kolafesi UTF-8, Anda harus memberikan kolatasi non-UTF-8 secara manual setiap kolom UTF-8 dalam pernyataan CREATE EXTERNAL TABLE. Ini karena dukungan UTF-8 tidak meluas ke tabel eksternal. Saat Anda mencoba membuat tabel eksternal dengan kolatasi UTF-8, Anda akan menerima Unsupported collation
pesan kesalahan. Jika kolatasi database tabel eksternal adalah kolatasi UTF-8, pembuatan tabel eksternal akan gagal kecuali Anda memberikan kolatasi kolom non-UTF-8 eksplisit, misalnya, [UTF8_column] varchar(128) COLLATE LATIN1_GENERAL_100_CI_AS_KS_WS NOT NULL,
.
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 SUMBER DATA EKSTERNAL dibuat dengan TYPE=HADOOP
.
Pembatasan dan batasan
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.
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:
- BUAT TABEL dan LETAKKAN TABEL
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- BUAT TAMPILAN dan JATUHKAN TAMPILAN
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 mungkin 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:
geography
geometry
hierarchyid
image
text
nText
xml
- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
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>' ;
CREATE EXTERNAL DATA SOURCE AzureDataLakeStore
WITH (TYPE = HADOOP,
LOCATION = 'abfss://data@pbasetr.azuredatalakestore.net'
);
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
)
);
CREATE EXTERNAL TABLE [dbo].[DimProduct_external]
( [ProductKey] [int] NOT NULL,
[ProductLabel] nvarchar NULL,
[ProductName] nvarchar NULL )
WITH
(
LOCATION='/DimProduct/' ,
DATA_SOURCE = AzureDataLakeStore ,
FILE_FORMAT = TextFileFormat ,
REJECT_TYPE = VALUE ,
REJECT_VALUE = 0
);
CREATE TABLE [dbo].[DimProduct]
WITH (DISTRIBUTION = HASH([ProductKey] ) )
AS 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 (
LOCATION = '/parquet/',
DATA_SOURCE = population_ds,
FILE_FORMAT = census_file_format
);
GO
SELECT TOP 1 * FROM census_external_table;
Langkah berikutnya
Pelajari selengkapnya tentang tabel eksternal dan konsep terkait dalam artikel berikut ini:
*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, sangat disarankan untuk memberikan nama tiga bagian.
<> column_definition [ ,...n ]
CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak bisa menggunakan DEFAULT CONSTRAINT pada tabel eksternal.
Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file akan 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 membuat jalur dan folder jika tidak ada. CREATE EXTERNAL TABLE
tidak membuat jalur dan folder.
Jika Anda menentukan LOCATION menjadi folder, kueri PolyBase yang memilih dari tabel eksternal akan 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 akan mengembalikan baris dari mydata.txt
dan mydata2.txt
. Ini tidak akan kembali mydata3.txt
karena berada di subfolder folder tersembunyi. Dan itu tidak akan kembali _hidden.txt
karena itu adalah file tersembunyi.
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 Penolakan
Opsi ini hanya dapat digunakan dengan sumber data eksternal di mana TYPE = HADOOP.
Anda dapat menentukan parameter penolakan yang menentukan bagaimana PolyBase akan 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 pernyataan CREATE EXTERNAL TABLE. Saat pernyataan SELECT mendatang atau pernyataan SELECT INTO SELECT memilih data dari tabel eksternal, PolyBase akan menggunakan opsi penolakan untuk menentukan jumlah atau persentase baris yang dapat ditolak sebelum kueri aktual gagal. Kueri akan menampilkan hasil (parsial) sampai ambang penolakan terlampaui. Kueri kemudian gagal dengan pesan kesalahan yang sesuai.
REJECT_TYPE = nilai | Persentase
Mengklarifikasi apakah opsi REJECT_VALUE ditentukan sebagai nilai harfiah atau persentase.
value
REJECT_VALUE adalah nilai harfiah, bukan persentase. Kueri PolyBase akan gagal ketika jumlah baris yang ditolak melebihi reject_value.
Misalnya, jika REJECT_VALUE = 5 dan REJECT_TYPE = nilai, kueri PolyBase SELECT akan gagal setelah lima baris ditolak.
Persentase
REJECT_VALUE adalah persentase, bukan nilai harfiah. Kueri PolyBase akan 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 = nilai, reject_value harus berupa bilangan bulat antara 0 dan 2.147.483.647.
Untuk REJECT_TYPE = persentase, reject_value harus berupa float antara 0 dan 100.
REJECT_SAMPLE_VALUE = reject_sample_value
Atribut ini diperlukan saat Anda menentukan REJECT_TYPE = persentase. 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 akan menghitung persentase baris yang gagal setelah mencoba mengimpor 1000 baris dari file data eksternal. Jika persentase baris yang gagal kurang dari reject_value, PolyBase akan mencoba mengambil 1000 baris lainnya. Ini terus menghitung ulang persentase baris yang gagal setelah mencoba mengimpor setiap 1000 baris tambahan.
Catatan
Karena PolyBase menghitung persentase baris yang gagal pada interval, persentase aktual baris yang gagal dapat melebihi reject_value.
Contoh:
Contoh ini menunjukkan bagaimana tiga opsi REJECT berinteraksi satu sama lain. Misalnya, jika REJECT_TYPE = persentase, REJECT_VALUE = 30, dan 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 akan 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. Perhatikan bahwa baris yang cocok telah 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 UBAH SUMBER DATA EKSTERNAL apa pun memberi prinsipal kemampuan 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 akan gagal dan tabel eksternal tidak akan 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 disebut 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.
Pembatasan dan batasan
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:
- BUAT TABEL dan LETAKKAN TABEL
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- BUAT TAMPILAN dan JATUHKAN TAMPILAN
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
PolyBase di SQL Server 2016 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:
geography
geometry
hierarchyid
image
text
nText
xml
- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
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 cs
JOIN [User] 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;
Langkah berikutnya
Pelajari selengkapnya tentang tabel eksternal di Sistem Platform Analitik di artikel berikut:
* 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 berbagai 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, sangat disarankan untuk memberikan nama tiga bagian.
<> column_definition [ ,...n ]
CREATE EXTERNAL TABLE mendukung kemampuan untuk mengonfigurasi nama kolom, jenis data, nullability, dan collation. Anda tidak bisa menggunakan DEFAULT CONSTRAINT pada tabel eksternal.
Definisi kolom, termasuk jenis data dan jumlah kolom, harus cocok dengan data dalam file eksternal. Jika ada ketidakcocokan, baris file akan 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 menjadi folder, kueri dari Azure SQL Managed Instance yang memilih dari tabel eksternal akan 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 akan mengembalikan baris dari mydata.txt
. Ini tidak akan kembali mydata2.txt
karena berada di subfolder, itu tidak akan kembali mydata3.txt
karena berada di folder tersembunyi, dan tidak akan kembali _hidden.txt
karena itu adalah file tersembunyi.
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
Catatan
Izin CONTROL DATABASE diperlukan untuk membuat KUNCI MASTER saja, 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 UBAH SUMBER DATA EKSTERNAL apa pun memberi prinsipal kemampuan 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.
Pembatasan dan batasan
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:
- BUAT TABEL dan LETAKKAN TABEL
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- BUAT TAMPILAN dan JATUHKAN TAMPILAN
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 akan gagal.
Batasan jenis data
Jenis data berikut tidak dapat digunakan dalam tabel eksternal di Azure SQL Managed Instance:
geography
geometry
hierarchyid
image
text
nText
xml
- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
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.
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 = '<Strong Password>' GO
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 '?' GO
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] ) GO
Buat FORMAT FILE EKSTERNAL dan TABEL EKSTERNAL, 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 ) GO --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 ( LOCATION = 'yellow/puYear=*/puMonth=*/*.parquet', DATA_SOURCE = NYCTaxiExternalDataSource, FILE_FORMAT = MyFileFormat ); GO --Then, query the data via an external table with T-SQL: SELECT TOP 10 * FROM tbl_TaxiRides; GO
Langkah berikutnya
Pelajari selengkapnya tentang tabel eksternal dan konsep terkait dalam artikel berikut ini: