Membuat kueri data Avro
GoogleSQL untuk Bigtable memungkinkan Anda membuat kueri, memfilter, dan memproyeksikan setiap kolom dari data Apache Avro yang diserialisasi yang disimpan oleh tabel Bigtable. Dengan mereferensikan paket skema Avro dalam kueri SQL, Anda dapat mentransmisikan kolom byte ke dalam data Avro terstruktur dan mengekstrak kolom bertingkat.
Sebelum mengkueri kolom Avro, Anda harus mengupload skema Avro dalam paket skema, seperti yang dijelaskan dalam Membuat dan mengelola skema Avro. Untuk mempelajari cara kueri GoogleSQL dipetakan ke skema tabel Bigtable dan cara mereferensikan kolom dalam pernyataan SQL, lihat Ringkasan GoogleSQL untuk Bigtable.
Untuk mengkueri data Avro dengan GoogleSQL di Java, gunakan metode executeQuery
di library klien Cloud Bigtable. Untuk mengetahui contoh cara menjalankan kueri SQL dengan library klien, lihat Library klien.
Pemetaan jenis data Avro
Saat Anda mentransmisikan BYTES yang diserialisasi ke data Avro, GoogleSQL untuk Bigtable memetakan jenis skema Avro ke jenis yang dapat diakses SQL, sebagai berikut:
| Jenis Avro | Representasi GoogleSQL | Deskripsi |
|---|---|---|
int, long |
INT64 |
Bilangan bulat bertanda 32-bit dan 64-bit dipetakan ke bilangan bulat 64-bit. |
float |
FLOAT32 |
Nilai floating point presisi tunggal |
double |
FLOAT64 |
Nilai floating point presisi ganda |
boolean |
BOOL |
Nilai boolean (TRUE atau FALSE) |
string |
STRING |
Urutan karakter Unicode |
bytes |
BYTES |
Urutan byte mentah |
record |
Objek pesan | Akses kolom bertingkat menggunakan notasi titik (misalnya, record.field). |
enum |
ENUM |
Kumpulan simbol yang dihitung |
array |
ARRAY |
Kolom berulang. Bigtable tidak mendukung array bertingkat. |
map<T> |
Entri nilai kunci berulang | Peta Avro memiliki kunci STRING. Bigtable mendukung peta dengan nilai nullable, seperti {"type": "map", "values": ["null", "string"]}. Anda dapat
mengubah peta menjadi
ARRAY<STRUCT<key STRING, value T>> menggunakan
fungsi ARRAY_TRANSFORM. |
union |
Kolom nullable | Bigtable memetakan union dengan null dan satu jenis non-null ke kolom nullable standar. |
fixed |
Bigtable tidak mendukung jenis fixed. |
Urutan byte dengan panjang tetap. |
Contoh data
Contoh di halaman ini menggunakan paket skema Avro dengan ID my_avro. Paket ini berisi skema data Transaction berikut dalam namespace com.example.billing:
{
"type": "record",
"namespace": "com.example.billing",
"name": "Transaction",
"fields": [
{"name": "product_name", "type": "string"},
{"name": "product_category", "type": "string"},
{"name": "configs", "type": {"type": "map", "values": "string"}}
]
}
Tabel Bigtable bernama table menyimpan data Avro yang diserialisasi
dalam grup kolom cf dan penentu kolom product
(cf['product']):
| Row key | Kolom cf['product'] (disimpan sebagai BYTES yang diserialisasi, ditampilkan sebagai JSON agar mudah dibaca) |
|---|---|
row1 |
{"product_name": "Chips", "product_category": "yummy food", "configs": {"size": "large", "flavor": "BBQ"}} |
row2 |
{"product_name": "Apple", "product_category": "yummy food", "configs": {}} |
row3 |
{"product_name": "Book", "product_category": "reading", "configs": {"author": "Jane Doe"}} |
Contoh kueri
Setelah mengupload paket skema Avro, Anda dapat menggunakan operator CAST di GoogleSQL untuk Bigtable guna menafsirkan nilai BYTES sebagai data Avro.
Mentransmisikan kolom dan memproyeksikan kolom
Untuk mentransmisikan nilai BYTES ke data Avro, tentukan nama data lengkap dalam format berikut:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME
Ganti kode berikut:
SCHEMA_BUNDLE_ID: ID paket skemaFULLY_QUALIFIED_RECORD_NAME: nama lengkap data Avro, termasuk namespace yang ditentukan dalam skema Avro Anda—misalnya,com.example.billing.Transaction
Jika paket skema atau nama data yang ditentukan tidak ada, kueri akan gagal dengan status INVALID_ARGUMENT dan pesan error type not found.
Jika skema yang disediakan tidak dapat mengurai byte sel, kueri akan gagal dengan status FAILED_PRECONDITION atau INVALID_ARGUMENT.
Kueri berikut mentransmisikan kolom cf['product'] ke
data com.example.billing.Transaction dalam paket skema my_avro dan
memproyeksikan kolom product_name:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table;
Kueri akan menampilkan hasil berikut:
product_name (STRING) |
|---|
| Chip |
| Apple |
| Buku |
Memfilter berdasarkan kolom Avro
Anda dapat menggunakan klausa WHERE untuk memfilter baris berdasarkan nilai kolom dalam
data Avro.
Kueri berikut memfilter baris yang kolom product_category-nya sama dengan "yummy food":
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
table
WHERE
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_category = "yummy food";
Kueri akan menampilkan hasil berikut:
product_name (STRING) |
|---|
| Chip |
| Apple |
Mengakses kolom peta
Anda dapat menggunakan fungsi ARRAY_TRANSFORM untuk memproyeksikan key-value pair dari kolom map Avro sebagai array elemen STRUCT.
Kueri berikut memproyeksikan product_name dan mengubah kolom peta configs
menjadi array elemen STRUCT<key STRING, value STRING>:
SELECT
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name,
ARRAY_TRANSFORM(
CAST(cf['product'] AS my_avro.com.example.billing.Transaction).configs,
e -> STRUCT(e.key, e.value)
) AS map_array
FROM
table;
Kueri akan menampilkan hasil berikut:
product_name (STRING) |
map_array (ARRAY<STRUCT<key STRING, value STRING>>) |
|---|---|
| Chip | [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}] |
| Apple | [] |
| Buku | [{"key": "author", "value": "Jane Doe"}] |
Penggunaan dengan tabel virtual
Anda dapat mereferensikan paket skema Avro dalam tampilan terwujud berkelanjutan dan tampilan logis.
Jika tampilan terwujud berkelanjutan atau tampilan logis mereferensikan paket skema Avro, Anda tidak dapat menghapus paket tersebut. Sebelum menghapus paket, Anda harus menghapus semua tampilan terwujud berkelanjutan yang mereferensikannya. Untuk tampilan logis yang mereferensikan paket, Anda harus memperbarui tampilan untuk menghapus referensi atau menghapusnya.
Perintah berikut membuat tampilan terwujud berkelanjutan yang menggabungkan jumlah transaksi berdasarkan product_name:
gcloud bigtable materialized-views create MATERIALIZED_VIEW_ID \
--instance=INSTANCE_ID \
--query="SELECT CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name AS product, COUNT(*) AS transaction_count FROM table GROUP BY product;"
Ganti kode berikut:
MATERIALIZED_VIEW_ID: ID tampilan terwujud berkelanjutan yang mereferensikan paket skemaINSTANCE_ID: ID instance Bigtable
Langkah berikutnya
- Pelajari cara membuat dan mengelola skema Avro.
- Pelajari cara membuat kueri data protobuf.
- Baca praktik terbaik desain skema.