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:
-
Mengekspor data dari tabel BigQuery:
BigQuery Data Viewer (
roles/bigquery.dataViewer
) -
Menjalankan tugas ekspor:
BigQuery User (
roles/bigquery.user
) -
Menulis data ke tabel Bigtable:
Bigtable User (
roles/bigtable.user
)
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
- Encoding dibatasi hanya untuk
BINARY
danTEXT
. - Ekspor ke Bigtable hanya didukung oleh berikut ini:
- Set data BigQuery sumber harus berada dalam multi-region AS.
- Profil aplikasi Bigtable harus dikonfigurasi untuk merutekan data ke cluster Bigtable yang berada di Amerika Serikat.
- Ekspor ke Bigtable hanya didukung untuk edisi BigQuery Enterprise atau Enterprise Plus. Edisi Standar BigQuery dan komputasi on-demand tidak didukung.
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 nilaiNULL
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 jenisSTRUCT
atauJSON
, semua nilai kolom yang termasuk dalam grup kolom terkait dari baris yang terpengaruh akan dihapus. Anda harus mentransmisikan nilaiNULL
ke jenisSTRUCT
atauJSON
agar mesin SQL dapat melampirkan jenis yang benar ke dalamnya. Kueri berikut menghapus semua data dari grup kolomcolumn_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 jenisSTRING
atauBYTES
. - 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:
- Meningkatkan jumlah node di cluster tujuan Bigtable.
- Mengonfigurasi profil aplikasi Bigtable yang dipilih menjadi perutean cluster tunggal.
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.