AnalyticDB for PostgreSQL kompatibel dengan sintaksis Teradata. Panduan ini mencakup perbedaan sintaksis, pemetaan tipe data, dan padanan fungsi yang diperlukan untuk merencanakan migrasi dari Teradata ke AnalyticDB for PostgreSQL.
Persyaratan migrasi
Migrasi yang sukses dari Teradata ke AnalyticDB for PostgreSQL dirancang untuk memenuhi tujuan berikut:
Melakukan migrasi lengkap platform data dasar gudang data.
Melakukan migrasi lancar untuk aplikasi yang telah dideploy pada sistem gudang data.
Lakukan migrasi platform dan data bisnis tanpa sepengetahuan pengguna bisnis.
Memastikan performa gudang data tetap optimal setelah migrasi.
Menetapkan durasi dan rencana migrasi yang efisien.
Memanfaatkan kembali sepenuhnya arsitektur sistem asli, proses ETL, struktur data, dan alat manajemen.
Lingkup migrasi
Migrasi Teradata lengkap mencakup empat area:
Data historis: Ekspor data sebagai file teks menggunakan delimiter dan pengkodean karakter yang ditentukan, simpan di disk lokal instans Elastic Compute Service (ECS) atau di bucket Object Storage Service (OSS) pada jaringan yang sama dengan instans AnalyticDB for PostgreSQL, lalu muat file tersebut melalui tabel eksternal OSS menggunakan protokol gpfdist. Ekspor skrip DDL dari Teradata dan konversi secara batch menggunakan sintaksis AnalyticDB for PostgreSQL.
Proses Extract-Transform-Load (ETL): Konversi pernyataan ETL ke sintaksis Data Manipulation Language (DML) AnalyticDB for PostgreSQL menggunakan alat konversi berbasis skrip. Ganti fungsi Teradata dengan padanan AnalyticDB for PostgreSQL berdasarkan tabel pemetaan fungsi dalam dokumen ini. Atur ulang dan jalankan kembali pekerjaan ETL setelah migrasi data historis selesai.
Koneksi API: AnalyticDB for PostgreSQL mendukung protokol JDBC dan ODBC, sehingga alat antarmuka depan Business Intelligence (BI) dapat terhubung dengan cara yang sama. Perbarui alamat IP instans untuk menyelesaikan migrasi API.
Alat manajemen: Deploy alat backup dan recovery untuk instans AnalyticDB for PostgreSQL serta jadwalkan simulasi recovery secara berkala.
Pemetaan tipe data
Sebagian besar tipe data inti memiliki pemetaan langsung antara Teradata dan AnalyticDB for PostgreSQL. Alat konversi Data Definition Language (DDL) berbasis skrip menangani konversi batch secara otomatis.
| Teradata | AnalyticDB for PostgreSQL | Catatan |
|---|---|---|
| CHAR | CHAR | Pemetaan langsung |
| VARCHAR | VARCHAR | Pemetaan langsung |
| LONG VARCHAR | VARCHAR(64000) | Panjang maksimum tetap |
| VARBYTE(size) | BYTEA | Tipe data biner |
| BYTEINT | BYTEA | Tipe data biner |
| SMALLINT | SMALLINT | Pemetaan langsung |
| INTEGER | INTEGER | Pemetaan langsung |
| DECIMAL(size,dec) | DECIMAL(size,dec) | Pemetaan langsung |
| NUMERIC(precision,dec) | NUMERIC(precision,dec) | Pemetaan langsung |
| FLOAT | FLOAT | Pemetaan langsung |
| REAL | REAL | Pemetaan langsung |
| DOUBLE PRECISION | DOUBLE PRECISION | Pemetaan langsung |
| DATE | DATE | Pemetaan langsung |
| TIME | TIME | Pemetaan langsung |
| TIMESTAMP | TIMESTAMP | Pemetaan langsung |
Pernyataan pembuatan tabel
Contoh berikut menunjukkan bagaimana pernyataan DDL Teradata dipetakan ke AnalyticDB for PostgreSQL. Perbedaan utama dianotasi dalam pernyataan yang telah dikonversi.
Teradata:
CREATE MULTISET TABLE test_table,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT,
DEFAULT MERGEBLOCKRATIO
(
first_column DATE FORMAT 'YYYYMMDD' TITLE 'COLUMN 1' NOT NULL,
second_column INTEGER TITLE 'COLUMN 2' NOT NULL ,
third_column CHAR(6) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 3' NOT NULL ,
fourth_column CHAR(20) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 4' NOT NULL,
fifth_column CHAR(1) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 5' NOT NULL,
sixth_column CHAR(24) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 6' NOT NULL,
seventh_column VARCHAR(18) CHARACTER SET LATIN CASESPECIFIC TITLE 'COLUMN 7' NOT NULL,
eighth_column DECIMAL(18,0) TITLE 'COLUMN 8' NOT NULL ,
nineth_column DECIMAL(18,6) TITLE 'COLUMN 9' NOT NULL )
PRIMARY INDEX ( first_column ,fourth_column )
PARTITION BY RANGE_N(first_column BETWEEN DATE '1999-01-01' AND DATE '2050-12-31' EACH INTERVAL '1' DAY );
CREATE INDEX test_index (first_column, fourth_column) ON test_table;AnalyticDB for PostgreSQL:
-- MULTISET TABLE, NO FALLBACK, NO BEFORE JOURNAL, NO AFTER JOURNAL,
-- CHECKSUM, DEFAULT MERGEBLOCKRATIO: klausa khusus Teradata dihapus
-- FORMAT 'YYYYMMDD', TITLE, CHARACTER SET, CASESPECIFIC: atribut kolom dihapus
CREATE TABLE test_table
(
first_column DATE NOT NULL, -- FORMAT 'YYYYMMDD' dihapus; gunakan SET client_encoding untuk pengkodean
second_column INTEGER NOT NULL ,
third_column CHAR(6) NOT NULL ,
fourth_column CHAR(20) NOT NULL,
fifth_column CHAR(1) NOT NULL,
sixth_column CHAR(24) NOT NULL,
seventh_column VARCHAR(18) NOT NULL,
eighth_column DECIMAL(18,0) NOT NULL ,
nineth_column DECIMAL(18,6) NOT NULL )
DISTRIBUTED BY ( first_column ,fourth_column ) -- PRIMARY INDEX -> DISTRIBUTED BY
PARTITION BY RANGE(first_column) -- sintaksis RANGE_N dikonversi ke RANGE standar
(START (DATE '1999-01-01') INCLUSIVE
END (DATE '2050-12-31') INCLUSIVE
EVERY (INTERVAL '1 DAY' ) );
create index test_index on test_table(first_column, fourth_column); -- sintaksis indeks tidak berubahRangkuman perbedaan DDL
| Area | Teradata | AnalyticDB for PostgreSQL |
|---|---|---|
| Kunci distribusi | PRIMARY INDEX (col1, col2) | DISTRIBUTED BY (col1, col2) |
| Partisi | PARTITION BY RANGE_N(...) | PARTITION BY RANGE(...) dengan START/END/EVERY |
| Pembuatan indeks | CREATE INDEX idx (cols) ON table | CREATE INDEX idx ON table(cols) |
| Judul kolom | TITLE 'label' | COMMENT ON COLUMN table.col IS 'label'; |
| Pengkodean kolom | CHARACTER SET LATIN CASESPECIFIC | SET client_encoding = latin1; (tingkat session) |
| Atribut tabel | MULTISET, NO FALLBACK, CHECKSUM, dll. | Tidak didukung; hapus klausa ini |
Format impor dan ekspor data
Baik Teradata maupun AnalyticDB for PostgreSQL mendukung format file TXT dan CSV. Perbedaan utamanya terletak pada separator:
Teradata: Separator dua karakter
AnalyticDB for PostgreSQL: Separator satu karakter
Konversi separator dalam file data Anda sebelum memuat.
Perbedaan pernyataan SQL
AnalyticDB for PostgreSQL mendukung sebagian besar sintaksis SQL Teradata. Pernyataan berikut memerlukan konversi.
CAST
Pernyataan CAST Teradata mendukung spesifikasi format; AnalyticDB for PostgreSQL tidak.
| Pernyataan | Teradata | AnalyticDB for PostgreSQL |
|---|---|---|
| Konversi integer | CAST(x AS INT FORMAT '999999') | Tulis fungsi kustom sebagai pengganti |
| Tanggal Tayang | CAST(x AS DATE FORMAT 'YYYYMMDD') | CAST(x AS DATE) — tidak perlu perubahan; format YYYY-MM-DD didukung secara native |
QUALIFY
Kata kunci QUALIFY milik Teradata menyaring hasil fungsi jendela secara inline. AnalyticDB for PostgreSQL tidak mendukung QUALIFY; tulis ulang sebagai subkueri.
Teradata:
SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC)
FROM (SELECT a1.item_id, SUM(a1.sale)
FROM sales AS a1
GROUP BY a1.itemID) AS t1 (itemid, sumprice)
QUALIFY RANK() OVER (ORDER BY sum_price DESC) <=100;AnalyticDB for PostgreSQL:
-- Bungkus fungsi jendela dalam subkueri, lalu saring di klausa WHERE luar
SELECT itemid, sumprice, rank FROM
(SELECT itemid, sumprice, RANK() OVER (ORDER BY sumprice DESC) AS rank
FROM (SELECT a1.item_id, SUM(a1.sale)
FROM sales AS a1
GROUP BY a1.itemID) AS t1 (itemid, sumprice)
) AS a
WHERE rank <=100;MACRO
Macro Teradata mengeksekusi sekelompok pernyataan SQL sebagai unit bernama. AnalyticDB for PostgreSQL tidak mendukung macro; gunakan FUNCTION sebagai gantinya.
Teradata:
CREATE MACRO Get_Emp_Salary(EmployeeNo INTEGER) AS (
SELECT
EmployeeNo,
NetPay
FROM
Salary
WHERE EmployeeNo = :EmployeeNo;
);AnalyticDB for PostgreSQL:
CREATE OR REPLACE FUNCTION Get_Emp_Salary(
EmployeeNo INTEGER,
OUT EmployeeNo INTEGER,
OUT NetPay FLOAT
) RETURNS SETOF RECORD AS
$$
SELECT EmployeeNo, NetPay
FROM Salary
WHERE EmployeeNo = $1
$$
LANGUAGE SQL;Pemetaan fungsi
Tabel berikut memetakan fungsi Teradata ke padanan AnalyticDB for PostgreSQL. Untuk fungsi yang tidak memiliki padanan langsung, tabel menyediakan ekspresi SQL yang dapat digunakan.
| Teradata | AnalyticDB for PostgreSQL | Deskripsi |
|---|---|---|
ZEROIFNULL(x) | COALESCE(x, 0) | Mengonversi NULL menjadi 0 untuk perhitungan kumulatif |
NULLIFZERO(x) | COALESCE | Mengganti nilai 0 dengan NULL untuk data kumulatif |
INDEX(str, substr) | POSITION(substr IN str) | Mengembalikan posisi substring dalam string |
ADD_MONTHS(date, n) | TO_DATE | Menambah atau mengurangi jumlah bulan tertentu ke/dari tanggal input |
FORMAT | TO_CHAR / TO_DATE | Memformat data sebagai string atau tanggal |
CSUM(col, order_col) | Subkueri | Mengembalikan jumlah kumulatif dari ekspresi nilai untuk setiap baris dalam partisi |
MAVG(col, n, order_col) | Subkueri | Menghitung rata-rata bergerak dari kolom tertentu berdasarkan jumlah baris yang ditentukan (lebar kueri) |
MSUM(col, n, order_col) | Subkueri | Menghitung jumlah bergerak dari kolom tertentu berdasarkan lebar kueri yang ditentukan |
MDIFF(col, n, order_col) | Subkueri | Menghitung selisih bergerak dari kolom tertentu berdasarkan lebar kueri yang ditentukan |
QUALIFY | Subkueri dengan WHERE pada hasil fungsi jendela | Menyaring hasil fungsi jendela; lihat bagian QUALIFY di atas |
CHAR(str) / CHARACTERS(str) | LENGTH(str) | Mengembalikan jumlah karakter dalam string |