Mengekspor data sebagai kolom Protobuf
Dokumen ini menjelaskan cara mengekspor data BigQuery sebagai kolom Buffering Protokol (Protobuf) menggunakan fungsi yang ditentukan pengguna (UDF) BigQuery.
Kapan kolom Protobuf digunakan
BigQuery menawarkan sejumlah fungsi bawaan untuk memformat data yang dipilih. Salah satu opsinya adalah menggabungkan beberapa nilai kolom menjadi satu nilai Protobuf, yang memiliki manfaat berikut:
- Keamanan jenis objek.
- Kompresi, waktu transfer data, dan biaya yang lebih baik dibandingkan dengan JSON.
- Fleksibilitas, karena sebagian besar bahasa pemrograman memiliki library untuk menangani Protobuf.
- Lebih sedikit overhead saat membaca dari beberapa kolom dan membangun satu objek.
Meskipun jenis kolom lainnya juga dapat memberikan keamanan jenis, penggunaan kolom Protobuf akan menyediakan objek fully-typed, yang dapat mengurangi jumlah pekerjaan yang perlu dilakukan pada lapisan aplikasi atau di bagian lain dari pipeline.
Namun, ada batasan untuk mengekspor data BigQuery sebagai kolom Protobuf:
- Kolom protobuf tidak diindeks atau difilter dengan baik. Mencari berdasarkan isi kolom Protobuf bisa menjadi kurang efektif.
- Mengurutkan data dalam format Protobuf bisa jadi sulit.
Jika batasan ini berlaku untuk alur kerja ekspor, Anda dapat mempertimbangkan metode lain untuk mengekspor data BigQuery:
- Gunakan kueri terjadwal dengan
pernyataan
EXPORT DATA
untuk mengurutkan data BigQuery yang diekspor menurut tanggal atau waktu, dan untuk menjadwalkan ekspor secara berulang. BigQuery mendukung pengeksporan data ke dalam format Avro, CSV, JSON, dan Parquet. - Gunakan Dataflow untuk mengekspor data BigQuery dalam format file Avro atau CSV.
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk mengekspor data BigQuery sebagai kolom Protobuf, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:
-
Membuat fungsi yang ditentukan pengguna:
BigQuery Data Editor (
roles/bigquery.dataEditor
) -
Mengekspor data dari tabel BigQuery:
BigQuery Data Viewer (
roles/bigquery.dataViewer
) -
Membaca dan mengupload file ke Cloud Storage:
Pembuat Objek Penyimpanan (
roles/storage.objectCreator
)
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.
Membuat UDF
Buat UDF yang mengonversi jenis data STRUCT
BigQuery menjadi kolom Protobuf:
Pada command line, clone repositori
bigquery-utils.git
:git clone https://github.com/GoogleCloudPlatform/bigquery-utils.git
Buka folder ekspor Protobuf:
cd bigquery-utils/tools/protobuf_export
Gunakan perintah
cp
atau browser file sistem operasi Anda untuk menyalin file proto ke folder turunan./protos
.Sudah ada file proto contoh bernama
dummy.proto
di folder./protos
.Instal paket yang diperlukan dari repositori GitHub:
npm install
Paketkan paket menggunakan webpack:
npx webpack --config webpack.config.js --stats-error-details
Temukan file
pbwrapper.js
di folder turunan./dist
, lalu upload file tersebut ke bucket Cloud Storage.Buka halaman BigQuery.
Dengan menggunakan editor kueri, buat UDF bernama
toMyProtoMessage
yang membangun kolom Protobuf dari kolom tabel BigQuery yang ada:CREATE FUNCTION DATASET_ID.toMyProtoMessage(input STRUCT<INPUT_FIELDS>) RETURNS BYTES LANGUAGE js OPTIONS ( library=["gs://BUCKET_NAME/pbwrapper.js"] ) AS r""" let message = pbwrapper.setup("PROTO_PACKAGE.PROTO_MESSAGE") return pbwrapper.parse(message, input) """;
Ganti kode berikut:
DATASET_ID
: ID set data yang akan berisi UDF.INPUT_FIELDS
: kolom yang digunakan dalam jenis pesan proto untuk file proto, dalam formatfield_name_1 field_type_1 [, field_name_2 field_type_2, ...]
.Anda harus menerjemahkan semua kolom jenis pesan yang menggunakan garis bawah menjadi camel case. Misalnya, jika jenis pesan terlihat seperti berikut, maka nilai kolom input harus
itemId int64, itemDescription string
:message ThisMessage { int64 item_id = 1; string item_description = 2; }
BUCKET_NAME
: nama bucket Cloud Storage yang berisi filepbwrapper.js
.PROTO_PACKAGE
: paket untuk file proto.PROTO_MESSAGE
: jenis pesan untuk file proto.
Misalnya, jika Anda menggunakan file
dummy.proto
yang disediakan, pernyataanCREATE FUNCTION
akan terlihat seperti berikut:CREATE OR REPLACE FUNCTION mydataset.toMyProtoMessage(input STRUCT<dummyField STRING>) RETURNS BYTES LANGUAGE js OPTIONS ( library=["gs://mybucket/pbwrapper.js"] ) AS r""" let message = pbwrapper.setup("dummypackage.DummyMessage") return pbwrapper.parse(message, input) """;
Memformat kolom sebagai nilai Protobuf
Jalankan UDF toMyProtoMessage
untuk memformat kolom tabel BigQuery sebagai nilai Protobuf:
SELECT
UDF_DATASET_ID.toMyProtoMessage(STRUCT(INPUT_COLUMNS)) AS protoResult
FROM
`PROJECT_ID.DATASET_ID.TABLE_NAME`
LIMIT
100;
Ganti kode berikut:
UDF_DATASET_ID
: ID set data yang berisi UDF.INPUT_COLUMNS
: nama kolom yang akan diformat sebagai nilai Protobuf, dalam formatcolumn_name_1 [, column_name_2, ...]
. Kolom dapat berupa jenis nilai skalar yang didukung atau jenis non-skalar, termasukARRAY
danSTRUCT
. Kolom input harus cocok dengan jenis dan jumlah kolom jenis pesan proto.PROJECT_ID
: ID project yang berisi tabel. Anda dapat melewati identifikasi project jika set data berada di project saat ini.DATASET_ID
: ID set data yang berisi tabel.TABLE_NAME
: nama tabel yang berisi kolom yang akan diformat.
Misalnya, jika Anda menggunakan UDF toMyProtoMessage
berdasarkan dummy.proto
,
pernyataan SELECT
berikut akan berfungsi:
SELECT
mydataset.toMyProtoMessage(STRUCT(word)) AS protoResult
FROM
`bigquery-public-data.samples.shakespeare`
LIMIT 100;
Menggunakan nilai Protobuf
Dengan data BigQuery yang diekspor dalam format Protobuf, Anda kini dapat menggunakan data sebagai objek atau struct yang memiliki jenis lengkap.
Contoh kode berikut memberikan beberapa contoh cara untuk memproses atau menggunakan data yang diekspor: