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 skema
  • FULLY_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 skema
  • INSTANCE_ID: ID instance Bigtable

Langkah berikutnya