Mengonfigurasi tabel inkremental

Dokumen ini menunjukkan cara menggunakan inti Dataform untuk mengonfigurasi tabel inkremental.

Tentang tabel inkremental

Dataform memperbarui tabel secara berbeda berdasarkan jenis tabel. Selama setiap eksekusi tabel atau tampilan, Dataform akan mem-build ulang seluruh tabel atau tampilan dari awal.

Saat Anda menentukan tabel inkremental, Dataform akan mem-build tabel inkremental dari awal hanya untuk pertama kalinya. Selama eksekusi berikutnya, Dataform hanya menyisipkan atau menggabungkan baris baru ke dalam tabel inkremental sesuai dengan kondisi yang Anda konfigurasikan.

Dataform hanya menyisipkan baris baru ke kolom yang sudah ada di tabel inkremental. Jika Anda membuat perubahan pada kueri definisi tabel inkremental — misalnya, menambahkan kolom baru — Anda harus mem-build ulang tabel dari awal. Untuk melakukannya, saat berikutnya Anda memicu eksekusi tabel, pilih opsi Jalankan dengan pembaruan penuh.

Berikut adalah beberapa kasus penggunaan umum untuk tabel inkremental:

Pengoptimalan performa
Untuk beberapa jenis data, seperti log web atau data analisis, Anda mungkin ingin hanya memproses data baru, bukan memproses ulang seluruh tabel.
Pengurangan latensi
Anda dapat menggunakan tabel inkremental untuk menjalankan alur kerja dengan cepat, tetapi sering, sehingga mengurangi latensi downstream tabel output.
Ringkasan harian
Anda dapat mengonfigurasi tabel inkremental untuk membuat snapshot harian data tabel, misalnya, untuk analisis longitudinal setelan pengguna yang disimpan dalam database produksi.

Sebelum memulai

  1. Di konsol Google Cloud , buka halaman Dataform.

    Buka halaman Dataform

  2. Pilih atau buat repositori.

  3. Pilih atau buat ruang kerja pengembangan.

  4. Buat tabel dari jenis tabel incremental.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna mengonfigurasi tabel inkremental, minta administrator untuk memberi Anda peran IAM Dataform Editor (roles/dataform.editor) di ruang kerja. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.

Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.

Memproses subset baris dalam tabel inkremental

Untuk menentukan subkumpulan baris yang akan diproses Dataform selama setiap eksekusi, tambahkan klausa WHERE bersyarat ke file definisi SQLX tabel inkremental. Dalam klausa WHERE, Anda dapat menentukan kondisi inkremental dan kondisi non-inkremental. Dataform menerapkan kondisi inkremental selama eksekusi tabel tanpa refresh penuh, dan kondisi non-inkremental selama eksekusi dengan refresh penuh.

Untuk mengonfigurasi tabel inkremental, ikuti langkah-langkah berikut:

  1. Buka ruang kerja pengembangan Anda.
  2. Di panel Files, luaskan definitions/.
  3. Buka file SQLX definisi tabel inkremental.
  4. Masukkan klausa WHERE dalam format berikut:

    config { type: "incremental" }
    
    SELECT_STATEMENT
    
    ${when(incremental(), `WHERE INCREMENTAL_CONDITION`, `WHERE NON_INCREMENTAL_CONDITION`) }
    

    Ganti kode berikut:

    • SELECT_STATEMENT: pernyataan SELECT yang menentukan tabel Anda
    • INCREMENTAL_CONDITION: kondisi yang Anda tentukan dalam klausa WHERE untuk memilih baris yang akan diproses Dataform selama eksekusi tabel tanpa refresh penuh.

    • NON_INCREMENTAL_CONDITION: kondisi yang Anda tentukan dalam klausa WHERE untuk memilih baris yang akan diproses Dataform selama eksekusi tabel dengan pembaruan penuh.

  5. Opsional: Klik Format.

Contoh kode berikut menunjukkan tabel inkremental yang secara bertahap memproses baris tabel productiondb.logs:

config { type: "incremental" }

SELECT timestamp, message FROM ${ref("productiondb", "logs")}

${when(incremental(),
   `WHERE date > (SELECT MAX(date) FROM ${self()}) AND country = "UK"`,
   `WHERE country = "UK"`)}

Contoh kode berikut menunjukkan tabel inkremental yang membuat snapshot tabel productiondb.customers:

config { type: "incremental" }

SELECT CURRENT_DATE() AS snapshot_date, customer_id, name, account_settings FROM ${ref("productiondb", "customers")}

${when(incremental(), `WHERE snapshot_date > (SELECT MAX(snapshot_date) FROM ${self()})`) }

Menggabungkan baris dalam tabel inkremental

Untuk memastikan bahwa tabel inkremental hanya berisi satu baris yang sesuai dengan kombinasi kolom yang dipilih, tetapkan kolom yang dipilih sebagai uniqueKey untuk menggabungkan baris yang memiliki uniqueKey yang sama. Saat memperbarui tabel, Dataform menggabungkan baris dengan uniqueKey, bukan menambahkannya.

Untuk mengonfigurasi penggabungan dalam tabel inkremental, ikuti langkah-langkah berikut:

  1. Buka ruang kerja pengembangan Anda.
  2. Di panel Files, luaskan definitions/.
  3. Memilih file SQLX definisi tabel inkremental
  4. Di blok config, tetapkan kolom yang dipilih sebagai uniqueKey dalam format berikut:

    uniqueKey: ["COLUMN_NAME"]
    

    Ganti COLUMN_NAME dengan nama kolom yang dipilih.

  5. Opsional: Klik Format.

Contoh kode berikut menunjukkan tabel inkremental dengan kolom transaction_id ditetapkan sebagai uniqueKey untuk memastikan tabel tersebut selalu berisi satu baris:

config {
  type: "incremental",
  uniqueKey: ["transaction_id"]
}

SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }

Memfilter baris dalam tabel inkremental

Dalam tabel yang dipartisi inkremental, agar Dataform tidak memindai seluruh tabel untuk menemukan baris yang cocok, tetapkan updatePartitionFilter agar hanya mempertimbangkan subkumpulan kumpulan data.

Contoh kode berikut menunjukkan tabel partisi inkremental dengan penggabungan yang dikonfigurasi dengan menetapkan properti uniqueKey dan updatePartitionFilter:

config {
  type: "incremental",
  uniqueKey: ["transaction_id"],
  bigquery: {
    partitionBy: "DATE(timestamp)",
    updatePartitionFilter:
        "timestamp >= timestamp_sub(current_timestamp(), interval 24 hour)"
  }
}

SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }

Menghindari pemindaian tabel penuh saat menyerap dari tabel yang dipartisi

Saat membuat tabel inkremental yang mereferensikan tabel berpartisi, sebaiknya buat kueri tabel untuk menghindari pemindaian tabel lengkap dari tabel berpartisi selama setiap pembaruan inkremental.

Anda dapat membatasi jumlah partisi yang dipindai BigQuery untuk memperbarui tabel inkremental menggunakan ekspresi konstan dalam kueri tabel. Untuk mengubah nilai dari tabel berpartisi menjadi ekspresi konstan, gunakan skrip BigQuery untuk mendeklarasikan nilai sebagai variabel dalam blok pre_operations. Kemudian, gunakan variabel sebagai ekspresi konstan dalam klausa WHERE dalam kueri SELECT.

Dengan konfigurasi ini, Dataform akan memperbarui tabel inkremental berdasarkan partisi terbaru dari tabel berpartisi yang dirujuk, tanpa memindai seluruh tabel.

Untuk mengonfigurasi tabel inkremental yang mereferensikan tabel berpartisi dan menghindari pemindaian tabel penuh, ikuti langkah-langkah berikut:

  1. Buka ruang kerja pengembangan Anda.
  2. Di panel Files, luaskan definitions/.
  3. Memilih file SQLX definisi tabel inkremental
  4. Di blok pre_operations, deklarasikan variabel dengan skrip BigQuery.
  5. Filter pernyataan SELECT yang menentukan tabel dengan klausa WHERE yang mereferensikan variabel yang dideklarasikan.
  6. Opsional: Klik Format.

Contoh kode berikut menunjukkan tabel inkremental tempat tabel raw_events yang direferensikan dipartisi oleh event_timestamp:

config {
  type: "incremental",
}

pre_operations {
  DECLARE event_timestamp_checkpoint DEFAULT (
    ${when(incremental(),
    `SELECT max(event_timestamp) FROM ${self()}`,
    `SELECT timestamp("2000-01-01")`)}
  )
}

SELECT
  *
FROM
  ${ref("raw_events")}
WHERE event_timestamp > event_timestamp_checkpoint

Dalam contoh kode sebelumnya, variabel event_timestamp_checkpoint ditentukan dalam blok pre_operations. Variabel event_timestamp_checkpoint kemudian digunakan sebagai ekspresi konstan dalam klausa WHERE.

Mem-build ulang tabel inkremental dari awal dengan pembaruan penuh

Anda dapat memaksa tabel inkremental untuk dibuat ulang dari awal menggunakan antarmuka command line dengan opsi --full-refresh atau dengan opsi Run with full refresh saat memicu eksekusi alur kerja.

Saat Anda memilih opsi refresh penuh, di ruang kerja pengembangan atau dengan menggunakan Dataform CLI, Dataform akan mengabaikan parameter ${when(incremental(), ... } selama eksekusi dan membuat ulang tabel dengan pernyataan CREATE OR REPLACE.

Melindungi tabel inkremental dari pembaruan penuh

Untuk melindungi tabel inkremental agar tidak dibuat ulang dari awal dan potensi hilangnya data, Anda dapat menetapkan tabel inkremental sebagai protected. Anda mungkin ingin mencegah tabel inkremental di-build ulang jika sumber data Anda bersifat sementara.

Untuk menandai tabel inkremental sebagai protected, ikuti langkah-langkah berikut:

  1. Buka ruang kerja pengembangan Anda.
  2. Di panel Files, luaskan definitions/.
  3. Pilih file SQLX definisi tabel inkremental.
  4. Di blok config, masukkan protected: true.
  5. Opsional: Klik Format.

Contoh kode berikut menunjukkan tabel inkremental yang ditandai sebagai protected:

config {
  type: "incremental",
  protected: true
}
SELECT ...

Langkah selanjutnya