ETL vs ELT

Membandingkan ETL dan ELT dari posisi transformasinya beserta alasan ELT menjadi standar pada stack analitik modern.

Daftar isi

Topik ini membandingkan ETL dan ELT, dua pola pemindahan data yang dibedakan oleh posisi transformasinya, lalu menunjukkan alasan ELT menjadi standar pada stack analitik modern. Stack analitik modern adalah rangkaian alat yang memindahkan data dari sumber sampai laporan. Satu demonstrasi ELT dijalankan sungguhan dengan DuckDB agar perpindahan posisi transformasi itu terlihat pada kode yang benar-benar berjalan. Setelah membaca topik ini, pemilihan antara keduanya dapat dijelaskan beserta konsekuensi operasionalnya.

Satu perbedaan: posisi transformasi#

ETL (extract, transform, load) mengekstrak data dari sumber, mengubahnya pada mesin transformasi terpisah, kemudian memuat hasil finalnya ke target. ELT (extract, load, transform) menukar dua langkah terakhir: data mentah dimuat lebih dahulu ke target, lalu transformasi dijalankan di dalam target itu sendiri. Perbedaan urutan ini terlihat kecil, tetapi menentukan siapa yang menghitung transformasi, bentuk data yang tersimpan, dan cara pipeline dipulihkan saat gagal.

AspekETLELT
Posisi transformasisebelum pemuatan, pada mesin terpisahsesudah pemuatan, di dalam target
Data yang tiba di targetsudah final sesuai kebutuhan laporanmentah, apa adanya
Mesin transformasilayanan atau skrip di luar targetmesin komputasi milik target
Jejak data mentahtidak tersimpan di targettersimpan dan dapat diproses ulang
Syarat utamamesin transformasi yang cukup kuattarget dengan komputasi yang cukup kuat

Tabel di atas menyimpan satu kesimpulan yang penting. Pada ETL, target hanya menerima data yang sudah jadi, sehingga kesalahan transformasi berarti data harus ditarik ulang dari sumber. Pada ELT, data mentah tetap tersimpan di target, sehingga logika transformasi dapat diperbaiki dan dijalankan ulang tanpa menyentuh sumbernya sama sekali. Dengan jejak mentah yang tersimpan, dua definisi logika juga dapat dibandingkan secara adil karena data yang sama dihitung ulang oleh keduanya.

Mengapa ELT menjadi standar stack analitik#

ELT menjadi standar karena target analitik modern berubah menjadi mesin komputasi yang kuat. Warehouse modern, yaitu basis data analitik yang menyimpan data per kolom dan memisahkan penyimpanan dari komputasi, mampu menjalankan transformasi SQL berskala besar dengan cepat. Ketika transformasi paling berat dapat dilakukan oleh target itu sendiri, mesin transformasi terpisah di tengah jalur data kehilangan sebagian besar alasan keberadaannya, dan urutan muat lalu transformasi menjadi pilihan yang lebih sederhana.

Alasan kedua bersifat operasional. Data mentah yang tersimpan membuat pemrosesan ulang menjadi murah, karena perbaikan logika cukup dijalankan ulang di atas data yang sudah ada. Transformasi yang berbentuk SQL di dalam target juga mudah dikontrol versinya, diujinya, dan dijadwalkannya, pola yang dipopulerkan alat transformasi seperti dbt. Sementara itu, ekstraksi menjadi pekerjaan yang lebih sederhana karena tidak lagi membawa logika bisnis apa pun.

ELT bukan pemenang mutlak. Data yang tidak boleh tiba mentah di target, misalnya karena kebijakan penyamaran data pribadi, tetap perlu diubah sebelum pemuatan. Pada target kecil tanpa komputasi memadai, transformasi di luar target juga tetap lebih masuk akal. Pada stack analitik dengan warehouse yang kuat, ELT menjadi titik berangkat yang lazim dipilih.

Demonstrasi ELT dengan DuckDB#

Demonstrasi berikut meniru alur ELT pada skala kecil: satu berkas CSV mentah dimuat apa adanya ke DuckDB, kemudian seluruh transformasi dijalankan di dalamnya lewat SQL. Berkas sumbernya adalah rekap penjualan alat tulis selama dua hari, dengan kolom kategori yang penulisan kapitalnya tidak konsisten. Urutan dua tahap inilah yang membedakannya dari ETL, karena tidak ada pengubahan data sebelum data itu tiba di target.

text penjualan.csv
id,tanggal,produk,kategori,jumlah,harga
1,2026-01-12,Buku Tulis,alat tulis,10,3500
2,2026-01-12,Pena Hitam,Alat Tulis,5,5000
3,2026-01-12,Penghapus,alat tulis,8,2000
4,2026-01-13,Buku Gambar,Alat Tulis,4,4500
5,2026-01-13,Penggaris,alat tulis,6,3000
6,2026-01-13,Buku Tulis,Alat Tulis,12,3500

Skrip di bawah ini menjalankan dua tahap dengan urutan yang khas ELT. Tahap muat memasukkan seluruh baris CSV ke tabel penjualan_mentah tanpa menafsirkan tipenya, sehingga semua kolomnya berstatus VARCHAR. Tahap transformasi membuat tabel penjualan_bersih dengan casting tipe eksplisit, menyeragamkan kolom kategori, dan menghitung kolom total, semuanya dengan SQL di dalam target. Jalankan skripnya dari direktori yang memuat kedua berkas, lalu perhatikan berkas penjualan.db yang muncul di direktori kerja sebagai tempat kedua tabel itu tersimpan.

python demo-elt.py
"""Demonstrasi ELT: CSV dimuat mentah ke DuckDB, transformasi berjalan di dalamnya."""

import os

import duckdb

BERKAS_DB = "penjualan.db"

# hapus basis data lama agar demo selalu berjalan dari keadaan awal yang sama
if os.path.exists(BERKAS_DB):
    os.remove(BERKAS_DB)

kon = duckdb.connect(BERKAS_DB)

# tahap muat: berkas CSV dimuat apa adanya, seluruh kolom dibiarkan VARCHAR
kon.execute(
    """
    CREATE TABLE penjualan_mentah AS
    SELECT * FROM read_csv('penjualan.csv', header = true, all_varchar = true)
    """
)

# tahap transformasi: dilakukan di dalam target, bukan saat ekstraksi
kon.execute(
    """
    CREATE TABLE penjualan_bersih AS
    SELECT
        CAST(id AS INTEGER)      AS id,
        CAST(tanggal AS DATE)    AS tanggal,
        trim(produk)             AS produk,
        lower(kategori)          AS kategori,
        CAST(jumlah AS INTEGER)  AS jumlah,
        CAST(harga AS INTEGER)   AS harga,
        CAST(jumlah AS INTEGER) * CAST(harga AS INTEGER) AS total
    FROM penjualan_mentah
    """
)

print("Tabel penjualan_bersih:")
print(f"{'id':>3} {'tanggal':<12} {'produk':<14} {'kategori':<10} {'jumlah':>6} {'harga':>6} {'total':>7}")
for id_, tanggal, produk, kategori, jumlah, harga, total in kon.execute(
    "SELECT * FROM penjualan_bersih ORDER BY id"
).fetchall():
    print(f"{id_:>3} {str(tanggal):<12} {produk:<14} {kategori:<10} {jumlah:>6} {harga:>6} {total:>7}")

print()
print("Rekap per kategori:")
print(f"{'kategori':<10} {'unit_terjual':>12} {'pendapatan':>10}")
for kategori, unit, pendapatan in kon.execute(
    """
    SELECT kategori, sum(jumlah) AS unit_terjual, sum(total) AS pendapatan
    FROM penjualan_bersih
    GROUP BY kategori
    ORDER BY kategori
    """
).fetchall():
    print(f"{kategori:<10} {unit:>12} {pendapatan:>10}")

kon.close()
text Keluaran
Tabel penjualan_bersih:
 id tanggal      produk         kategori   jumlah  harga   total
  1 2026-01-12   Buku Tulis     alat tulis     10   3500   35000
  2 2026-01-12   Pena Hitam     alat tulis      5   5000   25000
  3 2026-01-12   Penghapus      alat tulis      8   2000   16000
  4 2026-01-13   Buku Gambar    alat tulis      4   4500   18000
  5 2026-01-13   Penggaris      alat tulis      6   3000   18000
  6 2026-01-13   Buku Tulis     alat tulis     12   3500   42000

Rekap per kategori:
kategori   unit_terjual pendapatan
alat tulis           45     154000

Keluaran memperlihatkan hasil transformasi yang berjalan di dalam target. Kolom kategori yang semula campuran kapitalnya kini seragam, kolom tanggal dan angka sudah bertipe benar, dan kolom total dihitung oleh basis data, bukan oleh skrip ekstraksi. Rekap per kategorinya mencatat 45 unit terjual dengan pendapatan 154000. Seluruh perubahan itu terjadi setelah data dimuat, persis seperti gagasan ELT, dan bila logikanya keliru, tabel penjualan_mentah masih menyimpan bahan mentah untuk diproses ulang.

Kesalahan umum#

  1. Menganggap ELT menghapus kebutuhan disiplin transformasi. Penyebabnya, transformasi yang berjalan di dalam target terasa seperti bagian dari warehouse, bukan kode yang perlu diuji. Perbaikannya, perlakukan SQL transformasi seperti kode lain, yaitu dikontrol versinya dan diuji sebelum dijadwalkan.
  2. Membiarkan pemuatan mentah menafsirkan tipe secara otomatis lalu membangun logika di atasnya. Penyebabnya, hasil penafsiran otomatis dapat berubah ketika berkas sumber berubah sedikit saja. Perbaikannya, muat dengan tipe paling longgar seperti VARCHAR, kemudian lakukan casting eksplisit pada tahap transformasi.
  3. Mengubah data di tengah ekstraksi sehingga jejak mentahnya hilang. Penyebabnya, kebiasaan lama dari pola ETL membawa logika transformasi ke skrip penarik data. Perbaikannya, pisahkan tegas tahap muat yang naif dari tahap transformasi yang berada di dalam target.

Ringkasan#

  • Perbedaan ETL dan ELT terletak pada posisi transformasi, yaitu sebelum pemuatan pada mesin terpisah atau sesudah pemuatan di dalam target.
  • ELT menjadi standar stack analitik karena warehouse modern mampu menjalankan transformasi berskala besar dan menyimpan data mentah untuk diproses ulang.
  • Demonstrasi DuckDB menunjukkan muat apa adanya diikuti transformasi SQL di dalam target sebagai bentuk ELT yang paling murni.

Referensi#