CREATE EXTERNAL TABLE (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 T-SQL.
Pilih produk
Di baris berikut, pilih nama produk yang Anda minati, dan hanya informasi produk tersebut yang ditampilkan.
* SQL Server *
Ringkasan: SQL Server
Perintah ini membuat tabel eksternal untuk PolyBase untuk mengakses data yang disimpan dalam kluster Hadoop atau tabel eksternal PolyBase penyimpanan blob Azure yang mereferensikan data yang disimpan dalam kluster Hadoop atau penyimpanan blob Azure.
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 INSERTatauOPENROWSET
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 }
Nama tabel satu hingga tiga bagian untuk dibuat. Untuk tabel eksternal, SQL hanya menyimpan metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk dalam penyimpanan blob Hadoop atau Azure. 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 dari Pratinjau SQL Server 2022 (16.x). Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan di 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 ini, jika LOCATION='/webdata/', kueri PolyBase akan mengembalikan baris dari mydata.txt dan mydata2.txt. Ini tidak akan kembali mydata3.txt karena merupakan file dalam folder tersembunyi. Dan itu tidak akan mengembalikan _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 with SqlBinRoot the bin root of 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 blob penyimpanan Azure, 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.
Opsi Penolakan
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 atau pernyataan SELECT INTO SELECT di masa mendatang 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 mengembalikan 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.
nilai
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.
REJECTED_ROW_LOCATION = Lokasi Direktori
Diperkenalkan di SQL Server 2019 CU6. 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 secara eksplisit dinamai dalam parameter lokasi. Dalam direktori ini, ada folder yang dibuat berdasarkan waktu pengiriman beban dalam format YearMonthDay -HourMinuteSecond (Misalnya 20180330-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 berada dalam file terpisah, file yang sesuai memiliki akhiran yang cocok.
SCHEMA_NAME
Klausa SCHEMA_NAME menyediakan kemampuan untuk memetakan definisi tabel eksternal ke tabel dalam skema yang berbeda pada database jarak jauh. Gunakan klausa ini untuk membedakan antara skema yang ada pada database lokal dan jarak jauh.
OBJECT_NAME
Klausa OBJECT_NAME menyediakan kemampuan untuk memetakan definisi tabel eksternal ke tabel dengan nama yang berbeda pada database jarak jauh. Gunakan klausa ini untuk membedakan antara nama objek yang ada pada database lokal dan jarak jauh.
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.
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 penyimpanan blob Hadoop atau Azure.
Penting
Izin ALTER ANY EXTERNAL DATA SOURCE 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 lingkup 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 dalam kueri.
Pernyataan umum
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.
Hanya pernyataan Bahasa Definisi Data (DDL) ini yang diizinkan pada tabel eksternal:
- BUAT TABEL dan LETAKKAN TABEL
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- 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 di luar 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 ini tidak dapat digunakan dalam tabel eksternal PolyBase:
geographygeometryhierarchyidimagetextnTextxml- Jenis apa pun yang ditentukan pengguna
Batasan khusus 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 PolyBase ODBC Driver for 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 POlyBase ODBC 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 skema eksternal.
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
Keamanan
File data untuk tabel eksternal disimpan di penyimpanan blob Hadoop atau Azure. File data ini dibuat dan dikelola oleh proses Anda sendiri. Anda bertanggung jawab untuk mengelola keamanan data eksternal.
Contoh
A. 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 sumber data eksternal mydatasource_orc 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 tersambung 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 dan kemudian 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 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 sumber data yang dipecah
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
);
H. 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 LINGKUP 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 '.<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_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='.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. Mengkueri penyimpanan objek yang mematuhi S3 melalui tabel eksternal
Berlaku untuk: Pratinjau SQL Server 2022 (16.x) dan yang lebih baru
Contoh berikut menunjukkan penggunaan T-SQL untuk mengkueri file parquet yang disimpan dalam penyimpanan objek yang mematuhi 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:
* SQL Database *
Gambaran Umum: Azure SQL Database
Di Azure SQL Database, buat 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 }
Nama tabel satu hingga tiga bagian untuk 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 kolabasi. 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 jenis SUMBER DATA EKSTERNAL RDMS dan SHARD_MAP_MANAGER. Azure SQL Database tidak mendukung pembuatan tabel eksternal ke penyimpanan blob Azure.
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 nama tampilan katalog atau DMV dalam klausa SCHEMA_NAME dan/atau OBJECT_NAME. Misalnya, lihat Membuat tabel eksternal.
DISTRIBUSI
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 parameter <sharding_column_name>.
- 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 REVOKE untuk tabel eksternal sama seperti 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.
Pernyataan umum
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 bisa 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 bisa membuat beberapa tabel eksternal yang masing-masing mereferensikan sumber data eksternal yang berbeda.
Hanya pernyataan Bahasa Definisi Data (DDL) ini yang diizinkan pada tabel eksternal:
- CREATE TABLE dan DROP TABLE.
- CREATE VIEW dan DROP VIEW.
Konstruksi dan operasi tidak didukung:
- Batasan DEFAULT pada kolom tabel eksternal.
- Operasi Data Manipulation Language (DML) dari penghapusan, penyisipan, dan pembaruan.
- 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 yang ditautkan 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 ini tidak dapat digunakan dalam tabel eksternal PolyBase:
geographygeometryhierarchyidimagetextnTextxml- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
Contoh
A. 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)
Langkah berikutnya
Pelajari selengkapnya tentang tabel eksternal di Azure SQL Database di artikel berikut ini:
* Azure Synapse
Analitik *
Ringkasan: Azure Synapse Analytics
Gunakan tabel eksternal untuk:
- Kueri hadoop atau data penyimpanan blob Azure dengan pernyataan Transact-SQL.
- Impor dan simpan data dari penyimpanan blob Hadoop atau Azure.
- Mengimpor dan menyimpan data dari Azure Data Lake Store.
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 }
Nama tabel satu hingga tiga bagian untuk dibuat. Untuk tabel eksternal, hanya metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk di Penyimpanan blob Azure Data Lake, Hadoop, atau Azure. 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 kolabasi. Anda tidak bisa menggunakan DEFAULT CONSTRAINT pada tabel eksternal.
Catatan
Text, nText dan XML tidak didukung jenis data untuk kolom dalam tabel eksternal untuk Azure SQL Warehouse.
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 penyimpanan blob Azure Data Lake, Hadoop, atau Azure. Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan di 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 ini, jika LOCATION='/webdata/', kueri PolyBase akan mengembalikan baris dari mydata.txt dan mydata2.txt. Ini tidak akan mengembalikan mydata3.txt karena merupakan subfolder folder tersembunyi. Dan itu tidak akan mengembalikan _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.
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 Penolakan
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 atau pernyataan SELECT INTO SELECT di masa mendatang 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 mengembalikan 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.
nilai
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.
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, PolyBase akan membuatnya atas nama Anda. Direktori anak dibuat dengan nama "_rejectedrows". Karakter "_" memastikan bahwa direktori lolos untuk pemrosesan data lain kecuali secara eksplisit dinamai dalam parameter lokasi. Dalam direktori ini, ada folder yang dibuat berdasarkan waktu pengiriman beban dalam format YearMonthDay -HourMinuteSecond (Misalnya 20180330-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. 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 berada 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
Catatan
Izin DATABASE KONTROL diperlukan untuk hanya membuat KUNCI MASTER, INFO MASUK LINGKUP 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 penyimpanan blob Hadoop atau Azure.
Penting
Izin ALTER ANY EXTERNAL DATA SOURCE 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 lingkup 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 dalam kueri.
Pernyataan umum
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 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 Bahasa Definisi Data (DDL) ini yang diizinkan pada tabel eksternal:
- BUAT TABEL dan LETAKKAN TABEL
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- 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 di luar 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 ini tidak dapat digunakan dalam tabel eksternal PolyBase:
geographygeometryhierarchyidimagetextnTextxml- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
Contoh
A. Mengimpor Data dari ADLS Gen 2 ke Azure Microsoft Azure Synapse Analytics.
Misalnya untuk 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] ;
Langkah berikutnya
Pelajari selengkapnya tentang tabel eksternal dan konsep terkait dalam artikel berikut ini:
* Analitik
Sistem Platform (PDW) *
Gambaran Umum: Sistem Platform Analitik
Gunakan tabel eksternal untuk:
- Kueri hadoop atau data penyimpanan blob Azure dengan pernyataan Transact-SQL.
- Impor dan simpan data dari penyimpanan blob Hadoop atau Azure 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 }
Nama tabel satu hingga tiga bagian untuk dibuat. Untuk tabel eksternal, Sistem Platform Analitik hanya menyimpan metadata tabel bersama dengan statistik dasar tentang file atau folder yang dirujuk dalam penyimpanan blob Hadoop atau Azure. 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 kolabasi. 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 penyimpanan blob Hadoop atau Azure. Lokasi dimulai dari folder akar. Folder akar adalah lokasi data yang ditentukan di 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 ini, jika LOCATION='/webdata/', kueri PolyBase akan mengembalikan baris dari mydata.txt dan mydata2.txt. Ini tidak akan mengembalikan mydata3.txt karena merupakan subfolder folder tersembunyi. Dan itu tidak akan mengembalikan _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 with SqlBinRoot the bin root of 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 penyimpanan blob Hadoop atau Azure. 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
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 atau pernyataan SELECT INTO SELECT di masa mendatang 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 mengembalikan 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.
nilai
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 bisa 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 yang akan dicoba untuk diambil 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 tolak 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 Penyimpanan blob Hadoop atau Azure.
Penting
Izin ALTER ANY EXTERNAL DATA SOURCE memberi prinsipal kemampuan untuk membuat dan memodifikasi objek sumber data eksternal apa pun, dan oleh karena itu, juga memberikan kemampuan untuk mengakses semua kredensial lingkup 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.
Pernyataan umum
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 bisa 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 bisa 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 Bahasa Definisi Data (DDL) ini yang diizinkan pada tabel eksternal:
- CREATE TABLE dan DROP TABLE
- MEMBUAT STATISTIK DAN MENGHILANGKAN STATISTIK
- CREATE VIEW dan DROP VIEW
Konstruksi dan operasi tidak didukung:
- Batasan DEFAULT pada kolom tabel eksternal
- Operasi Data Manipulation Language (DML) dari penghapusan, penyisipan, dan pembaruan
- 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 di luar 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 ini tidak dapat digunakan dalam tabel eksternal PolyBase:
geographygeometryhierarchyidimagetextnTextxml- Jenis yang ditentukan pengguna
Penguncian
Kunci bersama pada objek SCHEMARESOLUTION.
Keamanan
File data untuk tabel eksternal disimpan di penyimpanan blob Hadoop atau Azure. File data ini dibuat dan dikelola oleh proses Anda sendiri. Anda bertanggung jawab untuk mengelola keamanan data eksternal.
Contoh
A. 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: