AnalyticDB for MySQL Data Warehouse Edition (V3.0) menggunakan tabel eksternal untuk memindahkan data antara AnalyticDB for MySQL dan sistem penyimpanan eksternal. Topik ini menjelaskan cara mengekspor data dari kluster AnalyticDB for MySQL ke Apsara File Storage for HDFS menggunakan tabel eksternal.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Memiliki kluster AnalyticDB for MySQL yang menjalankan V3.1.4.4 atau versi yang lebih baru.
Untuk memeriksa versi minor kluster Anda, lihat Bagaimana cara mengecek versi kluster AnalyticDB for MySQL? Untuk melakukan upgrade versi minor, hubungi dukungan teknis.
Memiliki kluster Apsara File Storage for HDFS dengan folder tujuan untuk data yang diekspor. Contoh ini menggunakan folder bernama
hdfs_output_test_csv_data.INSERT OVERWRITEmenghapus semua file yang ada di folder tujuan sebelum menulis data baru. Untuk menghindari kehilangan data secara tidak sengaja, buat folder tujuan baru untuk setiap pekerjaan ekspor alih-alih menggunakan kembali folder yang sudah ada.Mengonfigurasi port akses layanan berikut di kluster Apsara File Storage for HDFS agar dapat diakses oleh AnalyticDB for MySQL:
Node Tujuan Default Port Parameter konfigurasi Referensi NameNode Membaca dan menulis metadata sistem file 8020 fs.defaultFScore-default.xml DataNode Membaca dan menulis data 50010 dfs.datanode.addresshdfs-default.xml Untuk kluster dalam mode elastis: ENI diaktifkan pada halaman Cluster Information di bawah Network Information.

Catatan penggunaan
Hanya file CSV dan Parquet yang dapat diekspor. Format ORC tidak didukung.
INSERT INTO VALUESdanREPLACE INTO VALUEStidak didukung untuk tabel eksternal. GunakanINSERT INTO ... SELECTatauREPLACE INTO ... SELECTsebagai gantinya.Semua kolom tabel eksternal harus disertakan dalam ekspor. Ekspor hanya untuk subset kolom tidak didukung.
Tabel eksternal terpartisi tidak dapat mengekspor file individual; data selalu didistribusikan ke direktori partisi.
Nilai kolom partisi disimpan sebagai nama direktori HDFS, bukan sebagai kolom dalam file data yang diekspor. Misalnya, jika Anda mengekspor ke
adb_data/dengan kolom partisip1=1danp2=a, data akan disimpan diadb_data/p1=1/p2=a/. File CSV atau Parquet yang diekspor hanya berisi kolom non-partisi.
Ekspor data ke Apsara File Storage for HDFS
Langkah 1: Hubungkan ke kluster AnalyticDB for MySQL
Hubungkan ke kluster tersebut. Untuk detailnya, lihat Hubungkan ke kluster AnalyticDB for MySQL.
Langkah 2: Buat database dan tabel sumber
Contoh ini menggunakan database bernama adb_demo sebagai sumber.
Buat database sumber. Untuk detailnya, lihat Buat database.
Buat tabel sumber bernama
adb_hdfs_import_sourcediadb_demo:CREATE TABLE IF NOT EXISTS adb_hdfs_import_source ( uid string, other string ) DISTRIBUTED BY HASH(uid);Masukkan data uji:
INSERT INTO adb_hdfs_import_source VALUES ("1", "a"), ("2", "b"), ("3", "c");
Langkah 3: Buat tabel eksternal
Buat tabel eksternal di adb_demo yang dipetakan ke folder tujuan di Apsara File Storage for HDFS. AnalyticDB for MySQL mendukung dua jenis tabel eksternal: standar dan terpartisi.
Tabel eksternal standar
Tabel eksternal standar mengekspor semua data ke satu direktori tanpa sub-direktori partisi. Contoh berikut menunjukkan cara membuat tabel eksternal standar untuk format CSV dan Parquet.
Format CSV:
CREATE TABLE IF NOT EXISTS hdfs_import_external
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data"
}';Format Parquet:
CREATE TABLE IF NOT EXISTS hdfs_import_external
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data"
}';Tabel eksternal terpartisi
Tabel eksternal terpartisi mengatur data yang diekspor ke dalam sub-direktori partisi berdasarkan nilai kolom partisi. Definisikan kolom biasa (seperti uid dan other) serta kolom partisi (seperti p1, p2, dan p3) dalam pernyataan CREATE TABLE.
CREATE TABLE IF NOT EXISTS hdfs_import_external_par
(
uid string,
other string,
p1 date,
p2 int,
p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"csv",
"delimiter":",",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_output_test_csv_data",
"partition_column":"p1, p2, p3"
}';Untuk sintaks lengkap, lihat bagian Buat tabel eksternal Apsara File Storage for HDFS dan Buat tabel eksternal Apsara File Storage for HDFS terpartisi pada topik Gunakan tabel eksternal untuk mengimpor data ke Data Warehouse Edition.
Langkah 4: Ekspor data
Gunakan salah satu metode ekspor yang dijelaskan dalam apendiks untuk menjalankan pekerjaan ekspor:
Langkah berikutnya
Setelah ekspor selesai, verifikasi data dengan salah satu dari dua cara berikut:
Gunakan client Hadoop untuk menelusuri folder tujuan
hdfs_output_test_csv_data.Lakukan kueri terhadap data yang diekspor dari AnalyticDB for MySQL melalui tabel eksternal. Sintaks kueri sama untuk tabel eksternal standar maupun terpartisi:
SELECT * FROM hdfs_import_external LIMIT 100;
Apendiks 1: Metode ekspor untuk tabel eksternal standar
Tabel eksternal standar mendukung empat metode ekspor. Semua metode mengharuskan setiap kolom tabel eksternal disertakan dalam pernyataan SELECT.
| Metode | Pernyataan | Perilaku |
|---|---|---|
| Append | INSERT INTO | Menambahkan file baru ke direktori tujuan. File yang sudah ada tidak ditimpa. |
| Append (setara) | REPLACE INTO | Perilaku identik dengan INSERT INTO untuk tabel eksternal. Tabel eksternal tidak memiliki primary key, sehingga tidak ada deduplikasi. |
| Overwrite | INSERT OVERWRITE | Menghapus semua file yang ada di direktori tujuan, lalu menulis data baru. Gunakan dengan hati-hati. |
| Async overwrite | SUBMIT JOB INSERT OVERWRITE | Sama seperti overwrite, tetapi dijalankan secara asinkron. Mengembalikan job ID untuk pelacakan status. |
INSERT INTO
Setiap eksekusi menambahkan file baru ke direktori tujuan HDFS tanpa menghapus file yang sudah ada.
Sintaks:
INSERT INTO <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
INSERT INTO hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;col1, col2, col3 merepresentasikan semua kolom tabel eksternal.REPLACE INTO
Setara dengan INSERT INTO untuk tabel eksternal HDFS. Tabel eksternal tidak memiliki primary key, sehingga REPLACE INTO menambahkan file baru ke direktori tujuan alih-alih mengganti baris.
Sintaks:
REPLACE INTO <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
REPLACE INTO hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;INSERT OVERWRITE
Menghapus semua file di direktori tujuan sebelum menulis data baru.
Operasi ini tidak dapat dibatalkan. Semua file yang ada di path tabel eksternal akan dihapus secara permanen.
Sintaks:
INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
INSERT OVERWRITE hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;SUBMIT JOB INSERT OVERWRITE (async)
Menjalankan ekspor overwrite secara asinkron dan langsung mengembalikan job ID. Gunakan metode ini untuk ekspor besar yang jika tidak akan memblokir sesi.
Sintaks:
SUBMIT JOB INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
SUBMIT JOB INSERT OVERWRITE hdfs_import_external
SELECT col1, col2, col3 FROM adb_hdfs_import_source;Job ID yang dikembalikan mengidentifikasi tugas asinkron:
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+Untuk memeriksa status tugas, lihat Kirim tugas impor secara asinkron.
Apendiks 2: Metode ekspor untuk tabel eksternal terpartisi
Saat menggunakan tabel eksternal terpartisi, sertakan klausa PARTITION dalam pernyataan untuk menentukan nilai kolom partisi. Nilai partisi dapat sepenuhnya statis, campuran statis-dinamis, atau sepenuhnya dinamis.
Semua metode mengharuskan setiap kolom non-partisi tabel eksternal disertakan dalam pernyataan SELECT.
| Metode | Pernyataan | Perilaku |
|---|---|---|
| Append | INSERT INTO PARTITION | Menambahkan file baru ke direktori partisi yang sesuai. File yang sudah ada tidak ditimpa. |
| Append (setara) | REPLACE INTO PARTITION | Perilaku identik dengan INSERT INTO PARTITION untuk tabel eksternal. |
| Overwrite | INSERT OVERWRITE PARTITION | Menimpa data yang ada hanya di direktori partisi yang ditentukan. Partisi yang tidak terpengaruh tetap tidak berubah. |
| Async overwrite | SUBMIT JOB INSERT OVERWRITE | Sama seperti overwrite, tetapi dijalankan secara asinkron. |
INSERT INTO PARTITION
Setiap eksekusi menambahkan file baru ke direktori partisi yang sesuai.
Partisi sepenuhnya statis — semua nilai partisi ditentukan secara eksplisit:
INSERT INTO <target_table> PARTITION(par1=val1, par2=val2, ...)
SELECT <col_name> FROM <source_table>;Contoh:
INSERT INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test')
SELECT col1, col2, col3 FROM adb_hdfs_import_source;Partisi statis-dinamis — beberapa nilai partisi statis, sisanya berasal dari hasil kueri:
Kolom partisi statis harus muncul sebelum kolom partisi dinamis dalam klausa PARTITION.INSERT INTO <target_table> PARTITION(par1=val1, par2, ...)
SELECT <col_name> FROM <source_table>;Contoh:
INSERT INTO hdfs_import_external_par PARTITION(p1='2021-05-27', p2, p3)
SELECT col1, col2, col3 FROM adb_hdfs_import_source;Partisi sepenuhnya dinamis — nilai partisi berasal dari hasil kueri; tidak diperlukan klausa PARTITION:
INSERT INTO <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
INSERT INTO hdfs_import_external_par
SELECT col1, col2, col3 FROM adb_hdfs_import_source;REPLACE INTO PARTITION
Setara dengan INSERT INTO PARTITION untuk tabel eksternal HDFS. Tabel eksternal tidak memiliki primary key, sehingga REPLACE INTO PARTITION menambahkan file baru alih-alih mengganti baris.
Partisi sepenuhnya statis:
REPLACE INTO <target_table> PARTITION(par1=val1, par2=val2, ...)
SELECT <col_name> FROM <source_table>;Contoh:
REPLACE INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test')
SELECT col1, col2, col3 FROM adb_hdfs_import_source;Partisi statis-dinamis:
Kolom partisi statis harus muncul sebelum kolom partisi dinamis dalam klausa PARTITION.REPLACE INTO <target_table> PARTITION(par1=val1, par2, ...)
SELECT <col_name> FROM <source_table>;Contoh:
REPLACE INTO hdfs_import_external_par PARTITION(p1='2021-05-06', p2, p3)
SELECT col1, col2, col3 FROM adb_hdfs_import_source;Partisi sepenuhnya dinamis:
REPLACE INTO <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
REPLACE INTO hdfs_import_external_par
SELECT col1, col2, col3 FROM adb_hdfs_import_source;INSERT OVERWRITE PARTITION
Menimpa data yang ada di direktori partisi yang ditentukan. Partisi yang tidak tercakup oleh pernyataan tidak terpengaruh. Klausa opsional IF NOT EXISTS melewatkan partisi yang sudah berisi data.
Operasi ini tidak dapat dibatalkan. Data yang ada di partisi yang ditargetkan akan dihapus secara permanen.
Sintaks:
INSERT OVERWRITE <target_table> PARTITION(par1=val1, par2=val2, ...) [IF NOT EXISTS]
SELECT <col_name> FROM <source_table>;Contoh:
INSERT OVERWRITE hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test') IF NOT EXISTS
SELECT col1, col2, col3 FROM adb_hdfs_import_source;IF NOT EXISTS mencegah penulisan data ke partisi yang sudah berisi data, sehingga konten yang ada tetap utuh.SUBMIT JOB INSERT OVERWRITE (async)
Menjalankan ekspor overwrite partisi secara asinkron dan langsung mengembalikan job ID.
Sintaks:
SUBMIT JOB INSERT OVERWRITE <target_table>
SELECT <col_name> FROM <source_table>;Contoh:
SUBMIT JOB INSERT OVERWRITE hdfs_import_external_par PARTITION(p1='2021-05-06', p2=1, p3='test') IF NOT EXISTS
SELECT col1, col2, col3 FROM adb_hdfs_import_source;Job ID yang dikembalikan mengidentifikasi tugas asinkron:
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+Untuk memeriksa status tugas, lihat Kirim tugas impor secara asinkron.