Tabel eksternal di AnalyticDB for MySQL berfungsi sebagai jembatan ke Hadoop Distributed File System (HDFS). Buat tabel eksternal yang memetakan file HDFS Anda, lalu jalankan pernyataan INSERT SELECT untuk memuat data ke dalam tabel native AnalyticDB for MySQL.
Prasyarat
Sebelum memulai, pastikan hal-hal berikut:
Kebutuhan kluster:
Kluster AnalyticDB for MySQL Anda menjalankan versi kernel 3.1.4 atau yang lebih baru. Untuk memeriksa dan memperbarui versinya, masuk ke Konsol AnalyticDB for MySQL, lalu buka bagian Configuration Information pada halaman Cluster Information. Untuk petunjuk selengkapnya, lihat Memperbarui versi minor kluster.
Kluster Anda merupakan kluster Edisi Data Warehouse yang berjalan dalam mode elastis. Mode elastis diperlukan untuk akses Elastic Network Interface (ENI).
Kebutuhan HDFS:
File data HDFS Anda berformat CSV, Parquet, atau ORC.
Kluster HDFS Anda sedang berjalan dan data yang akan diimpor tersedia di direktori HDFS. Topik ini menggunakan
hdfs_import_test_data.csvsebagai contoh.Port layanan berikut terbuka di kluster HDFS untuk AnalyticDB for MySQL:
NameNode: Mengelola metadata sistem file. Port default: 8020, dikonfigurasi melalui
fs.defaultFS. Lihat core-default.xml.DataNode: Menangani operasi baca dan tulis data. Port default: 50010, dikonfigurasi melalui
dfs.datanode.address. Lihat hdfs-default.xml.
Network configuration:
Aktifkan akses ENI pada kluster Anda sebelum mengimpor data.
Login ke Konsol AnalyticDB for MySQL.
Pada halaman Cluster Information, buka bagian Network Information.
Nyalakan sakelar Elastic Network Interface (ENI).
Mengaktifkan atau menonaktifkan ENI akan mengganggu koneksi database selama sekitar 2 menit. Operasi baca dan tulis tidak tersedia selama periode tersebut. Rencanakan perubahan ini selama jendela pemeliharaan.
Impor data HDFS
Langkah 1: Buat database tujuan
CREATE DATABASE IF NOT EXISTS adb_demo;Langkah 2: Buat tabel eksternal HDFS
Dalam database adb_demo, buat tabel eksternal yang memetakan data HDFS Anda. Pilih tab yang sesuai dengan format file Anda.
CSV:
CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"csv",
"delimiter":",",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_csv_data/hdfs_import_test_data.csv"
}';Parquet:
CREATE TABLE IF NOT EXISTS hdfs_import_test_external_table
(
uid string,
other string
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"format":"parquet",
"hdfs_url":"hdfs://172.17.***.***:9000/adb/hdfs_import_test_parquet_data/"
}';ORC: Gunakan sintaks yang sama seperti Parquet, tetapi atur "format":"orc".
Untuk semua parameter yang tersedia dalam TABLE_PROPERTIES, lihat Parameter tabel eksternal.
Langkah 3: Buat tabel tujuan
Buat tabel native AnalyticDB for MySQL untuk menerima data yang diimpor.
Tabel standar:
CREATE TABLE IF NOT EXISTS adb_hdfs_import_test
(
uid string,
other string
)
DISTRIBUTED BY HASH(uid);Tabel terpartisi — sertakan kolom data dan kolom kunci partisi. Kolom kunci partisi harus ditempatkan di akhir daftar kolom:
CREATE TABLE IF NOT EXISTS adb_hdfs_import_parquet_partition
(
uid string,
other string,
p1 date,
p2 int,
p3 varchar
)
DISTRIBUTED BY HASH(uid);Langkah 4: Impor data
Pilih salah satu metode berikut. Sintaksnya sama baik untuk tabel tujuan standar maupun terpartisi.
| Metode | Perintah | Kapan digunakan |
|---|---|---|
| INSERT OVERWRITE (disarankan) | INSERT OVERWRITE <dest_table> SELECT * FROM <external_table> | Dataset besar. Mendukung impor batch dengan throughput tinggi. Data hanya terlihat setelah impor berhasil; dikembalikan jika gagal. |
| INSERT INTO | INSERT INTO <dest_table> SELECT * FROM <external_table> | Dataset kecil. Baris yang dimasukkan langsung tersedia untuk kueri. |
| Tugas asinkron | SUBMIT JOB INSERT OVERWRITE <dest_table> SELECT * FROM <external_table> | Impor berdurasi panjang. Mengembalikan job_id segera sehingga Anda dapat memantau progres. |
Contoh — INSERT OVERWRITE:
INSERT OVERWRITE adb_hdfs_import_test
SELECT * FROM hdfs_import_test_external_table;Contoh — tugas asinkron:
SUBMIT JOB INSERT OVERWRITE adb_hdfs_import_test
SELECT * FROM hdfs_import_test_external_table;Perintah tersebut mengembalikan job_id:
+---------------------------------------+
| job_id |
+---------------------------------------+
| 2020112122202917203100908203303****** |
+---------------------------------------+Gunakan job_id untuk memeriksa status impor. Untuk detailnya, lihat Kirim tugas impor secara asinkron.
Verifikasi impor
Setelah impor selesai, jalankan kueri berikut terhadap adb_demo untuk memastikan data telah dimuat dengan benar:
SELECT * FROM adb_hdfs_import_test LIMIT 100;Buat tabel eksternal HDFS terpartisi
Gunakan tabel eksternal terpartisi ketika data HDFS Anda diorganisasikan dalam struktur direktori hierarkis. HDFS mendukung data terpartisi dalam format Parquet, CSV, dan ORC. Partisi membentuk hierarki direktori seperti berikut:
parquet_partition_classic/
├── p1=2020-01-01
│ ├── p2=4
│ │ ├── p3=SHANGHAI
│ │ │ ├── 000000_0
│ │ │ └── 000000_1
│ │ └── p3=SHENZHEN
│ │ └── 000000_0
│ └── p2=6
│ └── p3=SHENZHEN
│ └── 000000_0
├── p1=2020-01-02
│ └── p2=8
│ ├── p3=SHANGHAI
│ │ └── 000000_0
│ └── p3=SHENZHEN
│ └── 000000_0
└── p1=2020-01-03
└── p2=6
├── p2=HANGZHOU
└── p3=SHENZHEN
└── 000000_0Pernyataan berikut membuat tabel eksternal untuk dataset Parquet terpartisi ini:
CREATE TABLE IF NOT EXISTS hdfs_parquet_partition_table
(
uid varchar,
other varchar,
p1 date,
p2 int,
p3 varchar
)
ENGINE='HDFS'
TABLE_PROPERTIES='{
"hdfs_url":"hdfs://172.17.***.**:9000/adb/parquet_partition_classic/",
"format":"parquet",
"partition_column":"p1, p2, p3"
}';Untuk menggunakan data CSV atau ORC, ubah "format" menjadi "csv" atau "orc". Jika format dihilangkan, CSV digunakan secara default.
Aturan untuk tabel eksternal terpartisi:
Properti
partition_columnmencantumkan kolom kunci partisi sesuai urutan kemunculannya dalam hierarki direktori. Urutannya harus persis sama.Definisikan kolom kunci partisi dalam pernyataan
CREATE TABLEdan letakkan di akhir daftar kolom, setelah semua kolom data.Kolom kunci partisi mendukung tipe data berikut:
BOOLEAN,TINYINT,SMALLINT,INT,INTEGER,BIGINT,FLOAT,DOUBLE,DECIMAL,VARCHAR,STRING,DATE, danTIMESTAMP.Kolom kunci partisi berperilaku seperti kolom biasa dalam kueri — Anda dapat melakukan SELECT dan filter berdasarkan kolom tersebut.
Untuk parameter
TABLE_PROPERTIESlainnya, lihat tabel parameter CSV atau tabel parameter Parquet/ORC.
Parameter tabel eksternal
Parameter CSV
| Parameter | Wajib | Deskripsi |
|---|---|---|
ENGINE='HDFS' | Ya | Menetapkan mesin penyimpanan ke HDFS. |
TABLE_PROPERTIES | Ya | Objek JSON yang berisi pengaturan koneksi dan format HDFS. |
format | Tidak | Format file. Atur ke csv. Jika dihilangkan, CSV digunakan secara default. |
delimiter | Tidak | Karakter pembatas kolom. Default: ,. |
hdfs_url | Ya | Path absolut ke file atau direktori HDFS. Harus diawali dengan hdfs://. Contoh: hdfs://172.17.*.*:9000/adb/data/file.csv |
partition_column | Tidak | Daftar kolom kunci partisi yang dipisahkan koma. Diperlukan untuk data terpartisi. |
compress_type | Tidak | Format kompresi. CSV hanya mendukung Gzip. |
skip_header_line_count | Tidak | Jumlah baris header yang dilewati. Atur ke 1 untuk melewati baris header kolom. Default: 0. |
hdfs_ha_host_port | Tidak | Alamat IP dan port NameNode untuk kluster high availability (HA). Format: ip1:port1,ip2:port2. Contoh: 192.168.xx.xx:8020,192.168.xx.xx:8021 |
Parameter Parquet dan ORC
| Parameter | Wajib | Deskripsi |
|---|---|---|
ENGINE='HDFS' | Ya | Menetapkan mesin penyimpanan ke HDFS. |
TABLE_PROPERTIES | Ya | Objek JSON yang berisi pengaturan koneksi dan format HDFS. |
format | Ya | Format file. Atur ke parquet atau orc. |
hdfs_url | Ya | Path absolut ke file atau direktori HDFS. Harus diawali dengan hdfs://. |
partition_column | Tidak | Daftar kolom kunci partisi yang dipisahkan koma. Diperlukan untuk data terpartisi. |
hdfs_ha_host_port | Tidak | Alamat IP dan port NameNode untuk kluster HA. Format: ip1:port1,ip2:port2. |
Aturan pemetaan kolom untuk file Parquet dan ORC:
Nama kolom dalam pernyataan
CREATE TABLEharus sesuai dengan nama kolom dalam file (tidak peka huruf besar/kecil). Urutan kolom juga harus sesuai.Anda dapat menyertakan hanya sebagian kolom dari file. Kolom yang tidak disertakan tidak akan diimpor.
Jika pernyataan
CREATE TABLEmereferensikan kolom yang tidak ada dalam file, kueri terhadap kolom tersebut akan mengembalikan NULL.
Batasan
Tabel eksternal CSV hanya mendukung kompresi Gzip.
Tabel eksternal Parquet tidak dapat menggunakan kolom bertipe
STRUCT.Tabel eksternal ORC tidak dapat menggunakan tipe
LIST,STRUCT, atauUNION. TipeMAPdapat digunakan saat pembuatan tabel tetapi tidak dapat dikueri.
Pemetaan tipe data
Parquet ke AnalyticDB for MySQL
| Tipe dasar di Parquet | Tipe logis di Parquet | Tipe data di AnalyticDB for MySQL |
|---|---|---|
| BOOLEAN | N/A | BOOLEAN |
| INT32 | INT_8 | TINYINT |
| INT32 | INT_16 | SMALLINT |
| INT32 | N/A | INT atau INTEGER |
| INT64 | N/A | BIGINT |
| FLOAT | N/A | FLOAT |
| DOUBLE | N/A | DOUBLE |
| FIXED_LEN_BYTE_ARRAY, BINARY, INT64, atau INT32 | DECIMAL | DECIMAL |
| BINARY | UTF-8 | VARCHAR, STRING, atau JSON (tersedia jika objek Parquet berisi kolom bertipe JSON) |
| INT32 | DATE | DATE |
| INT64 | TIMESTAMP_MILLIS | TIMESTAMP atau DATETIME |
| INT96 | N/A | TIMESTAMP atau DATETIME |
ORC ke AnalyticDB for MySQL
| Tipe data di ORC | Tipe data di AnalyticDB for MySQL |
|---|---|
| BOOLEAN | BOOLEAN |
| BYTE | TINYINT |
| SHORT | SMALLINT |
| INT | INT atau INTEGER |
| LONG | BIGINT |
| DECIMAL | DECIMAL |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| BINARY, STRING, atau VARCHAR | VARCHAR, STRING, atau JSON (tersedia jika objek ORC berisi kolom bertipe JSON) |
| TIMESTAMP | TIMESTAMP atau DATETIME |
| DATE | DATE |
Langkah berikutnya
Kirim tugas impor secara asinkron — pantau impor berdurasi panjang menggunakan
job_idPerbarui versi minor kluster — pastikan kluster Anda menggunakan versi kernel yang didukung