Mengekspor data ke Bigtable (Reverse ETL)

Dokumen ini menjelaskan cara menyiapkan ETL (RETL) terbalik dari BigQuery ke Bigtable. Anda dapat melakukannya dengan menggunakan pernyataan EXPORT DATA untuk mengekspor data dari tabel BigQuery ke tabel Bigtable.

Pengguna BigQuery dapat menyiapkan alur kerja RETL ke Bigtable yang menggabungkan kemampuan analisis BigQuery dengan latensi rendah dan throughput tinggi Bigtable. Alur kerja ini memungkinkan Anda menyajikan data kepada pengguna aplikasi tanpa menghabiskan kuota dan batasan di BigQuery.

Karakteristik tabel Bigtable

Tabel Bigtable berbeda dengan tabel BigQuery dalam beberapa hal:

  • Tabel Bigtable dan BigQuery terdiri dari baris, tetapi baris Bigtable terdiri dari row key dan grup kolom yang memiliki jumlah kolom arbitrer yang termasuk dalam grup kolom yang sama.
  • Grup kolom untuk tabel tertentu dibuat pada waktu pembuatan tabel, tetapi juga dapat ditambahkan atau dihapus di kemudian waktu. Saat grup kolom dibuat, kolom yang ada di dalamnya tidak perlu ditentukan.
  • Kolom Bigtable tidak perlu ditentukan sebelumnya dan dapat digunakan untuk menyimpan data atas namanya (juga dikenal sebagai penentu) dalam batas ukuran data dalam tabel.
  • Kolom Bigtable dapat memiliki nilai biner berapa pun dalam batas ukuran data dalam tabel.
  • Kolom Bigtable selalu memiliki dimensi temporal (juga dikenal sebagai versi). Nilai berapa pun dapat disimpan di baris mana pun untuk kolom yang sama selama stempel waktu tidak sama.
  • Stempel waktu Bigtable diukur dalam mikrodetik sejak waktu epoch Unix—misalnya, 0 mewakili 1970-01-01T00:00:00 UTC. Stempel waktu harus berupa angka mikrodetik non-negatif dengan perincian milidetik (hanya kelipatan 1000us yang diterima). Stempel waktu Bigtable default adalah 0.
  • Data di Bigtable dibaca berdasarkan row key, beberapa row key, rentang row key, atau dengan menggunakan filter. Setidaknya satu row key atau rentang row key diperlukan di semua jenis permintaan baca, kecuali untuk pemindaian tabel lengkap.

Untuk mengetahui informasi tentang cara menyiapkan hasil BigQuery untuk diekspor ke Bigtable, lihat Menyiapkan hasil kueri untuk ekspor.

Sebelum memulai

Berikan peran Identity and Access Management (IAM) yang memberi pengguna izin yang diperlukan untuk melakukan setiap tugas dalam dokumen ini.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan untuk mengekspor data BigQuery ke Bigtable, minta administrator Anda untuk memberi peran IAM berikut pada project Anda:

Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses.

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

Batasan

Jenis BigQuery yang didukung

Jenis data berikut didukung saat ditulis ke Bigtable:

Jenis BigQuery Nilai Bigtable ditulis
BYTES Diekspor apa adanya.
STRING Dikonversi ke BYTES.
INTEGER Jika bigtable_options.column_families.encoding ditetapkan ke BINARY, maka nilai akan ditulis dalam format big-endian 8 byte (byte paling signifikan terlebih dahulu). Jika bigtable_options.column_families.encoding disetel ke TEXT, nilai akan ditulis sebagai string yang dapat dibaca manusia yang mewakili angka.
FLOAT Menulis nilai dalam format output IEEE 754 8 byte.
BOOLEAN Jika bigtable_options.column_families.encoding ditetapkan ke BINARY, nilai ditulis sebagai nilai 1 byte (false = 0x00 atau true = 0x01). Jika bigtable_options.column_families.encoding ditetapkan ke TEXT, nilai akan ditulis sebagai teks ("true" atau "false").
JSON
Kolom jenis JSON yang diekspor ditafsirkan sebagai grup kolom yang termasuk dalam grup kolom Bigtable tertentu. Anggota objek JSON ditafsirkan sebagai kolom dan nilainya akan ditulis ke Bigtable. Nama kolom yang akan ditulis dapat disesuaikan menggunakan konfigurasi bigtable_options.

Contoh:

    JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY
    
Dengan nilai VALUE1 dan VALUE2 ditulis ke Bigtable sebagai kolom FIELD1 dan FIELD2 ke grup kolom MY_COLUMN_FAMILY.
STRUCT
Kolom jenis STRUCT yang diekspor ditafsirkan sebagai grup kolom yang termasuk dalam grup kolom Bigtable tertentu. Anggota struct ditafsirkan sebagai kolom dan nilainya yang akan ditulis ke Bigtable. Nama kolom yang akan ditulis dapat disesuaikan menggunakan konfigurasi bigtable_options.

Contoh:

    STRUCT<FIELD1  STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY
    
Dengan nilai FIELD1 dan FIELD2 ditulis ke Bigtable sebagai kolom FIELD1 dan FIELD2 ke grup kolom MY_COLUMN_FAMILY.

Jenis data yang didukung ini mirip dengan pembacaan dari tabel Bigtable eksternal untuk BigQuery.

Nilai NULL di Bigtable

Nilai NULL di Bigtable memiliki batasan berikut:

  • Bigtable tidak memiliki analog untuk nilai NULL. Mengekspor nilai NULL untuk grup kolom dan kolom tertentu di Bigtable akan menghapus nilai saat ini dari baris Bigtable.

  • Jika nilai Bigtable dengan row key, grup kolom, penentu kolom, dan stempel waktu tertentu tidak ada sebelum ekspor, nilai NULL yang diekspor tidak akan berpengaruh pada baris Bigtable.

  • Saat mengekspor nilai NULL dari jenis STRUCT atau JSON, semua nilai kolom yang termasuk dalam grup kolom terkait dari baris yang terpengaruh akan dihapus. Anda harus mentransmisikan nilai NULL ke jenis STRUCT atau JSON agar mesin SQL dapat melampirkan jenis yang benar ke dalamnya. Kueri berikut menghapus semua data dari grup kolom column_family1 dengan kumpulan rowkey tertentu:

    EXPORT DATA OPTIONS (...) AS
    SELECT
      rowkey,
    CAST(NULL as STRUCT) AS column_family1 FROM T
    
  • Baris dengan NULL row key akan dilewati selama ekspor. Jumlah baris yang dilewati akan ditampilkan dalam statistik ekspor ke pemanggil.

Mengonfigurasi ekspor dengan bigtable_options

Anda dapat menggunakan konfigurasi bigtable_options selama ekspor untuk menjembatani perbedaan antara model penyimpanan BigQuery dan Bigtable. Konfigurasi dinyatakan dalam bentuk string JSON, seperti yang terlihat dalam contoh berikut:

EXPORT DATA OPTIONS(
   uri="https://bigtable.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
   bigtable_options = """{
     "columnFamilies": [{
       "familyId": "COLUMN_FAMILY_NAME",
       "encoding": "ENCODING_VALUE",
       "columns": [
         {
           "qualifierString": "BIGTABLE_COLUMN_QUALIFIER",
           ["qualifierEncoded": "BASE_64_ENCODED_VALUE",]
           "fieldName": "BIGQUERY_RESULT_FIELD_NAME"
         }
       ]
    }]
   }"""
)

Tabel berikut menjelaskan kemungkinan kolom yang digunakan dalam konfigurasi bigtable_options:

Nama kolom Deskripsi
columnFamilies Array deskriptor grup kolom.
columnFamilies.familyId ID grup kolom Bigtable.
columnFamilies.encoding Nilai dapat ditetapkan ke BINARY atau TEXT. Untuk mengetahui informasi tentang cara jenis dienkode, lihat Jenis BigQuery yang didukung.
columnFamilies.columns Array pemetaan kolom Bigtable.
columnFamilies.columns.qualifierString Opsional: Penentu kolom Bigtable. Tentukan nilai ini jika penentu kolom tidak memiliki kode non-UTF-8. Kolom qualifierString dan qualifierEncoding sama-sama bersifat eksklusif. Jika qualifierString maupun qualifierEncoded tidak ditentukan, fieldName akan digunakan sebagai penentu kolom.
columnFamilies.columns.qualifierEncoded Opsional: Penentu kolom berenkode base64. Serupa dengan qualifierString jika penentu kolom harus memiliki kode non-UTF-8.
columnFamilies.columns.fieldName Wajib: Nama kolom kumpulan hasil BigQuery. Dapat berupa string kosong dalam kasus tertentu. Untuk mengetahui contoh cara nilai fieldName kosong digunakan dengan kolom jenis sederhana, lihat Menyiapkan hasil kueri untuk ekspor.

Menyiapkan hasil kueri untuk ekspor

Untuk mengekspor hasil kueri ke Bigtable, hasilnya harus memenuhi persyaratan berikut:

  • Kumpulan hasil harus berisi kolom rowkey dari jenis STRING atau BYTES.
  • Row key, penentu kolom, nilai, dan stempel waktu tidak boleh melebihi batas ukuran data dalam tabel Bigtable.
  • Minimal satu kolom selain rowkey harus ada dalam kumpulan hasil.
  • Setiap kolom kumpulan hasil harus berupa salah satu jenis BigQuery yang didukung. Jenis kolom apa pun yang tidak didukung harus dikonversi ke salah satu jenis yang didukung sebelum mengekspor ke Bigtable.

Bigtable tidak memerlukan penentu kolom agar menjadi nama kolom BigQuery yang valid, dan Bigtable mendukung penggunaan byte apa pun. Untuk informasi tentang cara mengganti penentu kolom target untuk ekspor, lihat Mengonfigurasi ekspor dengan bigtable_options.

Jika Anda menggunakan nilai yang diekspor dengan Bigtable API, seperti ReadModifyWriteRow, nilai numerik apa pun harus menggunakan encoding biner yang benar.

Secara default, jenis kolom hasil mandiri selain STRUCT atau JSON ditafsirkan sebagai nilai untuk grup kolom tujuan sama dengan nama kolom hasil, dan penentu kolom sama dengan string kosong.

Untuk menunjukkan cara penulisan jenis data ini, pertimbangkan contoh SQL berikut, dengan column dan column2 adalah kolom hasil mandiri:

SELECT
  x as column1, y as column2
FROM table

Dalam contoh kueri ini, SELECT x as column1 menulis nilai ke Bigtable dalam grup kolom column1 dan penentu kolom '' (string kosong) saat menangani jenis selain JSON atau STRUCT.

Anda dapat mengubah cara penulisan jenis ini dalam ekspor menggunakan konfigurasi bigtable_options, seperti yang terlihat dalam contoh berikut:

EXPORT DATA OPTIONS (
  …
  bigtable_options="""{
   "columnFamilies" : [
      {
        "familyId": "ordered_at",
        "columns": [
           {"qualifierString": "order_time", "fieldName": ""}
        ]
      }
   ]
}"""
) AS
SELECT
  order_id as rowkey,
  STRUCT(product, amount) AS sales_info,
  EXTRACT (MILLISECOND FROM order_timestamp AT TIME ZONE "UTC") AS ordered_at
FROM T

Dalam contoh ini, tabel BigQuery T berisi baris berikut:

order_id order_timestamp product amount
101 2023-03-28T10:40:54Z Joystick 2

Jika Anda menggunakan konfigurasi bigtable_options sebelumnya dengan tabel T, data berikut akan ditulis ke Bigtable:

rowkey sales_info (grup kolom) ordered_at (grup kolom)
101 produk jumlah order_time
1970-01-01T00:00:00Z Joystick 1970-01-01T00:00:00Z 2 1680000054000

1680000054000 mewakili 2023-03-28T10:40:54Z dalam milidetik sejak waktu epoch Unix dalam zona waktu UTC.

Tetapkan stempel waktu untuk semua sel dalam baris menggunakan _CHANGE_TIMESTAMP

Anda dapat menambahkan kolom _CHANGE_TIMESTAMP dari jenis TIMESTAMP ke hasil untuk ekspor. Setiap sel yang ditulis ke Bigtable menggunakan nilai stempel waktu dari _CHANGE_TIMESTAMP baris hasil yang diekspor.

Bigtable tidak mendukung stempel waktu yang lebih awal dari epoch Unix (1970-01-01T00:00:00Z). Jika nilai _CHANGE_TIMESTAMP adalah NULL, waktu Unix epoch 0 akan digunakan sebagai nilai stempel waktu default.

Kueri berikut menulis sel untuk kolom product dan amount dengan stempel waktu yang ditentukan dalam kolom order_timestamp pada tabel T.

EXPORT DATA OPTIONS (...) AS
SELECT
  rowkey,
  STRUCT(product, amount) AS sales_info,
  order_timestamp as _CHANGE_TIMESTAMP
FROM T

Ekspor beberapa hasil dengan nilai rowkey yang sama

Saat Anda mengekspor hasil yang berisi beberapa baris dengan nilai rowkey yang sama, nilai yang ditulis ke Bigtable akan berada di baris Bigtable yang sama.

Anda dapat menggunakan metode ini untuk menghasilkan beberapa versi nilai kolom di baris yang sama. Dalam contoh ini, tabel orders di BigQuery berisi data berikut:

id customer order_timestamp amount_spent
100 Bob 2023-01-01T10:10:54Z 10.99
101 Alice 2023-01-02T12:10:50Z 102.7
102 Bob 2023-01-04T15:17:01Z 11.1

Pengguna kemudian mengeksekusi pernyataan EXPORT DATA berikut:

EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
format="CLOUD_BIGTABLE"
) AS

SELECT customer as rowkey, STRUCT(amount_spent) as orders_column_family, order_timestamp as _CHANGE_TIMESTAMP
FROM orders

Menggunakan pernyataan ini dengan tabel orders BigQuery akan menghasilkan data berikut yang ditulis ke Bigtable:

orders_column_family
Row key amount_spent
Alice 2023-01-02T12:10:50Z 102.7
Bob 2023-01-01T10:10:54Z 10.99
2023-01-04T15:17:01Z 11.1

Mengekspor ke Bigtable akan menggabungkan nilai baru ke dalam tabel, bukan mengganti seluruh baris. Jika nilai sudah ada di Bigtable untuk row key, nilai baru dapat menggantikan sebagian atau sepenuhnya nilai sebelumnya, bergantung pada grup kolom, nama kolom, dan stempel waktu sel yang sedang ditulis.

Mengekspor beberapa kolom sebagai nilai Protocol Buffer (Protobuf)

Buffering protokol menyediakan mekanisme yang fleksibel dan efisien untuk membuat serialisasi data terstruktur. Mengekspor sebagai Protobuf dapat bermanfaat, mengingat berbagai jenis penanganan antara BigQuery dan Bigtable. Anda dapat menggunakan fungsi yang ditentukan pengguna (UDF) BigQuery untuk mengekspor data sebagai nilai biner Protobuf ke Bigtable. Untuk mengetahui informasi selengkapnya, lihat Mengekspor data sebagai kolom Protobuf.

Ekspor pengoptimalan

Ada beberapa cara untuk meningkatkan throughput tempat data diekspor dari BigQuery ke Bigtable. Anda dapat mengoptimalkan performa ekspor dengan:

Harga

Untuk mengetahui informasi tentang harga ekspor data, lihat halaman Harga BigQuery.

Setelah data diekspor, Anda dikenai biaya penyimpanan data di Bigtable. Untuk mengetahui informasi selengkapnya, lihat Harga Bigtable.