AnalyticDB for MySQL mendukung pengimporan data eksternal melalui tabel eksternal. Topik ini menjelaskan cara menggunakannya untuk mengimpor data dari OSS ke kluster AnalyticDB for MySQL.
Prasyarat
Kluster AnalyticDB for MySQL dan bucket OSS berada di wilayah yang sama. Untuk informasi selengkapnya, lihat Aktifkan OSS.
Anda telah mengunggah file data ke direktori OSS.
Akses antarmuka jaringan elastis (ENI) diaktifkan untuk kluster AnalyticDB for MySQL Edisi Data Warehouse.
PentingMasuk ke Konsol AnalyticDB for MySQL. Pada halaman Cluster Information, di bawah bagian Network Information, aktifkan sakelar jaringan ENI.
Mengaktifkan atau menonaktifkan jaringan ENI akan mengganggu koneksi database selama sekitar 2 menit, sehingga operasi baca dan tulis tidak tersedia. Evaluasi dampaknya secara hati-hati sebelum mengaktifkan atau menonaktifkan jaringan ENI.
Persiapan data
Contoh ini mengunggah file data person.csv ke direktori testBucketName/adb/dt=2023-06-15 di OSS. File tersebut menggunakan line feed sebagai pemisah baris dan koma (,) sebagai pemisah kolom. File person.csv berisi data sampel berikut:
1,james,10,2023-06-15
2,bond,20,2023-06-15
3,jack,30,2023-06-15
4,lucy,40,2023-06-15 Prosedur
Edisi Perusahaan, Edisi Dasar, dan Edisi Danau Data Terpadu
Buka editor Pengembangan SQL.
Masuk ke Konsol AnalyticDB for MySQL. Di pojok kiri atas konsol, pilih wilayah. Pada panel navigasi sebelah kiri, klik Clusters. Temukan kluster yang ingin Anda kelola, lalu klik ID-nya.
Pada panel navigasi sebelah kiri, pilih .
Impor data.
Anda dapat mengimpor data menggunakan impor reguler (default) atau impor elastis. Dalam mode impor reguler, sistem membaca data sumber dari node komputasi dan membuat indeks pada node penyimpanan, sehingga mengonsumsi sumber daya komputasi dan penyimpanan. Metode impor elastis hanya didukung untuk kluster Edisi Perusahaan, Edisi Dasar, dan Edisi Danau Data Terpadu yang menjalankan versi kernel 3.1.10.0 atau lebih baru serta memiliki kelompok sumber daya jenis pekerjaan. Untuk informasi selengkapnya, lihat Metode impor data.
Impor reguler
Buat database eksternal.
CREATE EXTERNAL DATABASE adb_external_db;Buat tabel eksternal dengan menggunakan pernyataan CREATE EXTERNAL TABLE untuk membuat tabel eksternal OSS di database eksternal adb_external_db. Topik ini menggunakan
adb_external_db.personsebagai contoh.CatatanTabel eksternal AnalyticDB for MySQL harus memiliki nama bidang, jumlah bidang, urutan bidang, dan tipe data yang sama dengan file sumber OSS.
Untuk informasi selengkapnya tentang sintaksis pembuatan tabel eksternal OSS, lihat CREATE EXTERNAL TABLE.
Lakukan kueri data.
Setelah membuat tabel eksternal, Anda dapat menjalankan pernyataan SELECT di AnalyticDB for MySQL untuk mengkueri data dari OSS.
SELECT * FROM adb_external_db.person;Hasil berikut dikembalikan:
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+Buat database di AnalyticDB for MySQL. Jika database sudah ada, langkah ini dapat dilewati. Berikut adalah contoh pernyataannya:
CREATE DATABASE adb_demo;Buat tabel di AnalyticDB for MySQL untuk menyimpan data OSS yang diimpor. Berikut adalah contoh pernyataannya:
CatatanTabel internal harus sesuai dengan tabel eksternal dari langkah b dalam hal nama bidang, jumlah bidang, urutan bidang, dan tipe data.
CREATE TABLE IF NOT EXISTS adb_demo.adb_import_test( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id);Impor data ke dalam tabel.
-
Metode 1: Gunakan pernyataan
INSERT INTO. Jika terjadi duplikasi primary key, data baru akan diabaikan. Ini setara denganINSERT IGNORE INTO. Untuk informasi selengkapnya, lihat INSERT INTO. Contoh:INSERT INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
Metode 2: Gunakan pernyataan
INSERT OVERWRITE INTOuntuk mengimpor data secara sinkron. Pernyataan ini akan menimpa data yang sudah ada di tabel. Contoh:INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_external_db.person; -
Metode 3: Gunakan pernyataan
INSERT OVERWRITE INTOuntuk mengimpor data secara asinkron. Untuk informasi selengkapnya, lihat penulisan asinkron. Contoh:SUBMIT JOB INSERT OVERWRITE adb_demo.adb_import_test SELECT * FROM adb_external_db.person;
-
Impor elastis
Buat database. Jika database tersebut sudah ada, lewati langkah ini. Berikut contoh pernyataannya:
CREATE DATABASE adb_demo;Buat tabel eksternal.
CatatanTabel eksternal AnalyticDB for MySQL harus memiliki nama bidang, jumlah bidang, urutan bidang, dan tipe data yang sama dengan file sumber OSS.
Impor elastis hanya mendukung pembuatan tabel eksternal melalui pernyataan
CREATE TABLE.
CREATE TABLE oss_import_test_external_table ( id INT(1023), name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketName/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":"," }';PentingSaat membuat tabel eksternal, parameter TABLE_PROPERTIES yang didukung bervariasi tergantung pada format file (CSV, Parquet, atau ORC):
Format CSV: Hanya parameter
endpoint,url,accessid,accesskey,format,delimiter,null_value,maxlinelength, danpartition_columnyang didukung.Format Parquet: Hanya parameter
endpoint,url,accessid,accesskey,format,maxlinelength, danpartition_columnyang didukung.Format ORC: Hanya parameter
endpoint,url,accessid,accesskey,format,maxlinelength, danpartition_columnyang didukung.
Untuk informasi selengkapnya mengenai parameter yang dapat dikonfigurasi untuk tabel eksternal beserta deskripsinya, lihat Tabel eksternal OSS tanpa partisi dan Tabel eksternal OSS berpartisi.
Lakukan kueri data.
Setelah tabel eksternal dibuat, Anda dapat menjalankan pernyataan SELECT di AnalyticDB for MySQL untuk mengkueri data dari OSS.
SELECT * FROM oss_import_test_external_table;Hasil berikut dikembalikan:
+------+-------+------+-----------+ | id | name | age | dt | +------+-------+------+-----------+ | 1 | james | 10 |2023-06-15 | | 2 | bond | 20 |2023-06-15 | | 3 | jack | 30 |2023-06-15 | | 4 | lucy | 40 |2023-06-15 | +------+-------+------+-----------+ 4 rows in set (0.35 sec)Buat tabel di AnalyticDB for MySQL untuk menyimpan data OSS yang diimpor. Berikut contoh pernyataannya:
CatatanTabel internal harus sesuai dengan tabel eksternal dari langkah b dalam hal nama bidang, jumlah bidang, urutan bidang, dan tipe data.
CREATE TABLE adb_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id);Impor data.
PentingImpor elastis hanya mendukung pengimporan data menggunakan pernyataan
INSERT OVERWRITE INTO.Metode 1: Jalankan pernyataan INSERT OVERWRITE INTO untuk mengimpor data secara elastis dengan menimpa data yang sudah ada di tabel. Berikut contoh pernyataannya:
/*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;
Metode 2: Jalankan pernyataan INSERT OVERWRITE INTO secara asinkron untuk mengimpor data secara elastis. Anda dapat menggunakan pernyataan
SUBMIT JOBguna mengirimkan tugas asinkron yang dijadwalkan di latar belakang./*+elastic_load=true, elastic_load_configs=[adb.load.resource.group.name=resource_group]*/ SUBMIT JOB INSERT OVERWRITE INTO adb_demo.adb_import_test SELECT * FROM adb_demo.oss_import_test_external_table;PentingAnda tidak dapat mengatur antrian prioritas saat mengirimkan tugas impor elastis secara asinkron.
Hasil berikut dikembalikan:
+---------------------------------------+ | job_id | +---------------------------------------+ | 202308151719510210170190********** |
Setelah mengirimkan tugas asinkron menggunakan
SUBMIT JOB, hasil yang dikembalikan hanya menunjukkan bahwa tugas berhasil dikirim. Anda dapat menggunakan job ID untuk menghentikan tugas asinkron atau memeriksa statusnya guna menentukan apakah tugas tersebut berhasil dieksekusi. Untuk informasi selengkapnya, lihat Kirim pekerjaan impor asinkron.Parameter petunjuk:
-
elastic_load: menentukan apakah akan menggunakan impor elastis. Nilai yang valid: true dan false. Nilai default: false.
None
Parameter
Wajib
Deskripsi
adb.load.resource.group.name
Ya
Nama kelompok sumber daya pekerjaan yang menjalankan pekerjaan impor elastis.
adb.load.job.max.acu
Tidak
Jumlah maksimum sumber daya untuk pekerjaan impor elastis. Satuan: unit komputasi AnalyticDB (ACU). Nilai minimum: 5 ACU. Nilai default: jumlah shard ditambah 1.
Jalankan pernyataan berikut untuk menanyakan jumlah shard di kluster:
SELECT count(1) FROM information_schema.kepler_meta_shards;spark.driver.resourceSpec
Tidak
Jenis sumber daya Spark driver. Nilai default: small. Untuk informasi tentang nilai yang valid, lihat kolom Type pada tabel "Parameter konfigurasi aplikasi Spark".
spark.executor.resourceSpec
Tidak
Jenis sumber daya Spark executor. Nilai default: large. Untuk informasi tentang nilai yang valid, lihat kolom Type pada tabel "Parameter konfigurasi aplikasi Spark".
spark.adb.executorDiskSize
Tidak
Kapasitas disk Spark executor. Nilai yang valid: (0,100]. Satuan: GiB. Nilai default: 10 GiB. Untuk informasi selengkapnya, lihat bagian "Tentukan sumber daya driver dan executor".
(Opsional) Periksa apakah tugas impor yang dikirim merupakan tugas impor elastis.
SELECT job_name, (job_type = 3) AS is_elastic_load FROM INFORMATION_SCHEMA.kepler_meta_async_jobs where job_name = "2023081818010602101701907303151******";Hasil berikut akan dikembalikan:
+---------------------------------------+------------------+ | job_name | is_elastic_load | +---------------------------------------+------------------+ | 20230815171951021017019072*********** | 1 | +---------------------------------------+------------------+Jika nilai
is_elastic_loadadalah 1, tugas impor tersebut merupakan tugas impor elastis. Jika nilainya 0, tugas tersebut merupakan tugas impor reguler.
Edisi gudang data
Hubungkan ke kluster dan buat database.
CREATE DATABASE adb_demo;Buat tabel eksternal menggunakan sintaksis CREATE TABLE untuk membuat tabel eksternal OSS dalam format CSV, Parquet, atau ORC. Untuk informasi selengkapnya tentang sintaksis tersebut, lihat Sintaksis tabel eksternal OSS.
Topik ini menggunakan tabel eksternal tanpa partisi dalam format CSV sebagai contoh.
CREATE TABLE IF NOT EXISTS oss_import_test_external_table ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) ENGINE='OSS' TABLE_PROPERTIES='{ "endpoint":"oss-cn-hangzhou-internal.aliyuncs.com", "url":"oss://testBucketname/adb/dt=2023-06-15/person.csv", "accessid":"accesskey_id", "accesskey":"accesskey_secret", "delimiter":",", "skip_header_line_count":0, "charset":"utf-8" }';Lakukan kueri data dari tabel eksternal
oss_import_test_external_table.CatatanUntuk file data CSV, Parquet, atau ORC, kueri pada tabel eksternal berukuran besar dapat menyebabkan overhead performa yang signifikan. Untuk meningkatkan efisiensi kueri, kami menyarankan agar Anda mengimpor data dari tabel eksternal OSS ke AnalyticDB for MySQL sebelum menjalankan kueri, seperti dijelaskan pada Langkah 4 dan 5.
SELECT * FROM oss_import_test_external_table;Buat tabel di AnalyticDB for MySQL untuk menyimpan data yang diimpor dari tabel eksternal OSS.
CREATE TABLE IF NOT EXISTS adb_oss_import_test ( id INT, name VARCHAR(1023), age INT, dt VARCHAR(1023) ) DISTRIBUTED BY HASH(id);Jalankan pernyataan INSERT untuk mengimpor data dari tabel eksternal OSS ke AnalyticDB for MySQL.
PentingSecara default, operasi impor data menggunakan
INSERT INTOatauINSERT OVERWRITE SELECTdijalankan secara sinkron. Untuk dataset besar—misalnya ratusan gigabyte—klien harus mempertahankan koneksi persisten ke server AnalyticDB for MySQL dalam waktu lama. Selama periode tersebut, gangguan jaringan dapat memutus koneksi dan menyebabkan kegagalan impor. Oleh karena itu, untuk volume data besar, kami menyarankan penggunaanSUBMIT JOB INSERT OVERWRITE SELECTguna melakukan impor secara asinkron.Metode 1: Jalankan pernyataan
INSERT INTOuntuk mengimpor data. Jika terjadi duplikasi primary key, operasi penulisan saat ini akan diabaikan dan data tidak diperbarui. Perilaku ini setara denganINSERT IGNORE INTO. Untuk informasi selengkapnya, lihat INSERT INTO. Berikut contoh pernyataannya:INSERT INTO adb_oss_import_test SELECT * FROM oss_import_test_external_table;Metode 2: Jalankan pernyataan INSERT OVERWRITE untuk mengimpor data, menimpa data yang sudah ada di tabel. Berikut contoh pernyataannya:
INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;Metode 3: Jalankan pernyataan
INSERT OVERWRITEsecara asinkron untuk mengimpor data. Anda dapat menggunakanSUBMIT JOBuntuk mengirimkan tugas asinkron guna penjadwalan latar belakang. Anda juga dapat menambahkan petunjuk (/*+ direct_batch_load=true*/) sebelum tugas penulisan untuk mempercepat prosesnya. Untuk informasi selengkapnya, lihat Penulisan asinkron. Berikut contoh pernyataannya:SUBMIT JOB INSERT OVERWRITE adb_oss_import_test SELECT * FROM oss_import_test_external_table;Hasil berikut dikembalikan:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |Untuk informasi selengkapnya tentang cara mengirimkan tugas asinkron, lihat Kirim pekerjaan impor asinkron.
Sintaksis tabel eksternal OSS
Edisi Perusahaan, Edisi Dasar, dan Edisi Danau Data Terpadu
Untuk informasi mengenai sintaksis pembuatan tabel eksternal OSS di Edisi Perusahaan, Edisi Dasar, dan Edisi Danau Data Terpadu, lihat Tabel eksternal OSS.
Gudang Data
Tabel eksternal OSS tanpa partisi
CREATE TABLE [IF NOT EXISTS] table_name
(column_name column_type[, …])
ENGINE='OSS'
TABLE_PROPERTIES='{
"endpoint":"endpoint",
"url":"OSS_LOCATION",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"format":"csv|orc|parquet|text
"delimiter|field_delimiter":";",
"skip_header_line_count":1,
"charset":"utf-8"
}';Jenis tabel eksternal | Parameter | Wajib | Deskripsi |
Tabel eksternal dalam format CSV, Parquet, dan ORC | ENGINE='OSS' | Ya | Mesin tabel. Tetapkan nilainya ke OSS. |
endpoint | Endpoint bucket OSS. Saat ini, AnalyticDB for MySQL hanya dapat mengakses OSS melalui jaringan VPC. Catatan Masuk ke Konsol OSS, klik bucket target, dan lihat Endpoint pada halaman Overview bucket tersebut. | ||
url | Jalur ke file atau direktori OSS.
| ||
accessid | ID AccessKey Akun Alibaba Cloud atau Pengguna RAM yang memiliki izin manajemen OSS. Untuk informasi tentang cara mendapatkan ID AccessKey, lihat Akun dan izin. | ||
accesskey | Rahasia AccessKey Akun Alibaba Cloud atau Pengguna RAM yang memiliki izin manajemen OSS. Untuk mendapatkan Rahasia AccessKey, lihat Akun dan izin. | ||
format | Wajib bersyarat | Format file.
| |
maxlinelength | Tidak | Nilai default: 32768 (32 KB). Jika file data berisi baris yang melebihi panjang ini, Anda dapat menambahkan parameter ini. Contoh: | |
Tabel eksternal dalam format CSV dan Text | delimiter|field_delimiter | Ya | Pemisah kolom file data.
|
Tabel eksternal dalam format CSV | null_value | Tidak | Menentukan apa yang merepresentasikan nilai Penting Parameter ini memerlukan kluster dengan versi kernel 3.1.4.2 atau lebih baru. |
ossnull | Menentukan aturan untuk menginterpretasikan nilai
Catatan Contoh di atas mengasumsikan bahwa | ||
skip_header_line_count | Jumlah baris yang dilewati dari awal file data. Misalnya, jika file CSV memiliki baris header, atur parameter ini ke 1 untuk melewatinya. Nilai default adalah 0, yang berarti tidak ada baris yang dilewati. | ||
oss_ignore_quote_and_escape | Jika diatur ke true, tanda kutip dan karakter escape dalam nilai bidang akan diabaikan. Default-nya adalah false. Penting Parameter ini memerlukan kluster dengan versi kernel 3.1.4.2 atau lebih baru. | ||
charset | Set karakter tabel eksternal OSS. Nilai yang valid:
Penting Parameter ini memerlukan kluster dengan versi kernel 3.1.10.4 atau lebih baru. |
-
Nama kolom dan urutannya dalam pernyataan CREATE EXTERNAL TABLE harus sesuai dengan file sumber Parquet atau ORC. Nama kolom tidak peka terhadap huruf besar/kecil.
-
Anda dapat membuat tabel eksternal menggunakan subset kolom dari file sumber. Kolom yang tidak ditentukan dalam pernyataan CREATE EXTERNAL TABLE akan diabaikan.
-
Jika pernyataan CREATE EXTERNAL TABLE mencakup kolom yang tidak ada dalam file Parquet atau ORC, kueri pada kolom tersebut akan mengembalikan NULL.
AnalyticDB for MySQL dapat membaca dan menulis file TEXT Hive menggunakan tabel eksternal OSS dalam format CSV. Gunakan pernyataan berikut untuk membuat tabel:
CREATE TABLE adb_csv_hive_format_oss (
a tinyint,
b smallint,
c int,
d bigint,
e boolean,
f float,
g double,
h varchar,
i varchar, -- binary
j timestamp,
k DECIMAL(10, 4),
l varchar, -- char(10)
m varchar, -- varchar(100)
n date
) ENGINE = 'OSS' TABLE_PROPERTIES='{
"format": "csv",
"endpoint":"oss-cn-hangzhou-internal.aliyuncs.com",
"accessid":"accesskey_id",
"accesskey":"accesskey_secret",
"url":"oss://testBucketname/adb_data/",
"delimiter": "\\1",
"null_value": "\\\\N",
"oss_ignore_quote_and_escape": "true",
"ossnull": 2
}';Perhatikan hal-hal berikut saat membuat tabel eksternal OSS dalam format CSV untuk membaca file TEXT Hive:
Pemisah kolom default untuk file TEXT Hive adalah
\1. Saat menggunakan tabel eksternal OSS berformat CSV untuk membaca atau menulis file tersebut, Anda harus mengatur parameterdelimiterke nilai yang telah di-escape\\1.Nilai
NULLdefault untuk file TEXT Hive adalah\N. Saat menggunakan tabel eksternal OSS berformat CSV untuk membaca atau menulis file tersebut, Anda harus mengatur parameternull_valueke nilai yang telah di-escape\\\\N.Tipe data dasar Hive lainnya, seperti
BOOLEAN, dipetakan langsung ke tipe data AnalyticDB for MySQL. Namun, tipeBINARY,CHAR(n), danVARCHAR(n)semuanya dipetakan ke tipe AnalyticDB for MySQLVARCHAR.
Lampiran: Pemetaan tipe data
Tipe data yang Anda tentukan saat membuat tabel harus sesuai dengan pemetaan dalam tabel berikut. Untuk tipe
DECIMAL, presisi juga harus sesuai.Tabel eksternal Parquet tidak mendukung tipe
STRUCT. Jika Anda menggunakan tipe ini, pembuatan tabel akan gagal.Tabel eksternal ORC tidak mendukung tipe kompleks seperti
LIST,STRUCT, danUNION. Jika Anda menggunakan tipe-tipe tersebut, pembuatan tabel akan gagal. Anda dapat membuat tabel eksternal ORC yang berisi kolom bertipeMAP, tetapi kueri terhadap tabel tersebut akan gagal.
File Parquet dan AnalyticDB for MySQL pemetaan tipe data
Tipe primitif Parquet | Tipe logis Parquet | AnalyticDB for MySQL tipe |
BOOLEAN | Tidak ada | BOOLEAN |
INT32 | INT_8 | TINYINT |
INT32 | INT_16 | SMALLINT |
INT32 | Tidak ada | INT atau INTEGER |
INT64 | Tidak ada | BIGINT |
FLOAT | Tidak ada | FLOAT |
DOUBLE | Tidak ada | DOUBLE |
| DECIMAL | DECIMAL |
BINARY | UTF-8 |
|
INT32 | DATE | DATE |
INT64 | TIMESTAMP_MILLIS | TIMESTAMP atau DATETIME |
INT96 | Tidak ada | TIMESTAMP atau DATETIME |
File ORC ke AnalyticDB for MySQL pemetaan tipe data
Tipe ORC | AnalyticDB for MySQL tipe |
BOOLEAN | BOOLEAN |
BYTE | TINYINT |
SHORT | SMALLINT |
INT | INT atau INTEGER |
LONG | BIGINT |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
|
|
TIMESTAMP | TIMESTAMP atau DATETIME |
DATE | DATE |
File Paimon dan AnalyticDB for MySQL pemetaan tipe data
Tipe Paimon | AnalyticDB for MySQL tipe |
CHAR | VARCHAR |
VARCHAR | VARCHAR |
BOOLEAN | BOOLEAN |
BINARY | VARBINARY |
VARBINARY | VARBINARY |
DECIMAL | DECIMAL |
TINYINT | TINYINT |
SMALLINT | SMALLINT |
INT | INTEGER |
BIGINT | BIGINT |
FLOAT | REAL |
DOUBLE | DOUBLE |
DATE | DATE |
TIME | Tidak didukung |
TIMESTAMP | TIMESTAMP |
LocalZonedTIMESTAMP | TIMESTAMP (mengabaikan informasi zona waktu lokal) |
ARRAY | ARRAY |
MAP | MAP |
ROW | ROW |