All Products
Search
Document Center

AnalyticDB:Ekspor data ke HDFS

Last Updated:Mar 28, 2026

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 OVERWRITE menghapus 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:

    NodeTujuanDefault PortParameter konfigurasiReferensi
    NameNodeMembaca dan menulis metadata sistem file8020fs.defaultFScore-default.xml
    DataNodeMembaca dan menulis data50010dfs.datanode.addresshdfs-default.xml
  • Untuk kluster dalam mode elastis: ENI diaktifkan pada halaman Cluster Information di bawah Network Information. Turn on ENI

Catatan penggunaan

  • Hanya file CSV dan Parquet yang dapat diekspor. Format ORC tidak didukung.

  • INSERT INTO VALUES dan REPLACE INTO VALUES tidak didukung untuk tabel eksternal. Gunakan INSERT INTO ... SELECT atau REPLACE INTO ... SELECT sebagai 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 partisi p1=1 dan p2=a, data akan disimpan di adb_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.

  1. Buat database sumber. Untuk detailnya, lihat Buat database.

  2. Buat tabel sumber bernama adb_hdfs_import_source di adb_demo:

    CREATE TABLE IF NOT EXISTS adb_hdfs_import_source
    (
        uid string,
        other string
    )
    DISTRIBUTED BY HASH(uid);
  3. 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.

MetodePernyataanPerilaku
AppendINSERT INTOMenambahkan file baru ke direktori tujuan. File yang sudah ada tidak ditimpa.
Append (setara)REPLACE INTOPerilaku identik dengan INSERT INTO untuk tabel eksternal. Tabel eksternal tidak memiliki primary key, sehingga tidak ada deduplikasi.
OverwriteINSERT OVERWRITEMenghapus semua file yang ada di direktori tujuan, lalu menulis data baru. Gunakan dengan hati-hati.
Async overwriteSUBMIT JOB INSERT OVERWRITESama 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.

Penting

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.

MetodePernyataanPerilaku
AppendINSERT INTO PARTITIONMenambahkan file baru ke direktori partisi yang sesuai. File yang sudah ada tidak ditimpa.
Append (setara)REPLACE INTO PARTITIONPerilaku identik dengan INSERT INTO PARTITION untuk tabel eksternal.
OverwriteINSERT OVERWRITE PARTITIONMenimpa data yang ada hanya di direktori partisi yang ditentukan. Partisi yang tidak terpengaruh tetap tidak berubah.
Async overwriteSUBMIT JOB INSERT OVERWRITESama 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.

Penting

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.