Mengkueri data protobuf

Dokumen ini memberikan contoh pola kueri umum untuk membaca dan membuat kueri data buffer protokol (protobuf) yang disimpan di Bigtable.

Sebelum membaca halaman ini, pahami hal-hal berikut:

Contoh data

Contoh berikut menggunakan tabel Music yang menyimpan informasi tentang album dan artis. Data disimpan dalam grup kolom bernama album_details, dengan penentu kolom album. Penentu kolom berisi pesan protobuf.

Skema protobuf ditentukan dalam file proto berikut:

  • artist.proto:

    syntax = "proto3";
    
    package package_name;
    
    message Artist {
     string name = 1;
    }
    
  • album.proto:

    syntax = "proto3";
    
    package package_name;
    
    import "artist.proto";
    
    message Album {
     string title = 1;
     Artist artist = 2;
     int32 release_year = 3;
    }
    

Akibatnya, Bigtable membuat paket skema untuk tabel ini yang berisi set deskriptor berikut untuk definisi protobuf ini:

file {
  name: "artist.proto"
  package: "package_name"
  message_type {
    name: "Artist"
    field {
      name: "name"
      number: 1
      label: LABEL_OPTIONAL
      type: TYPE_STRING
      json_name: "name"
    }
  }
  syntax: "proto3"
}
file {
  name: "album.proto"
  package: "package_name"
  dependency: "artist.proto"
  message_type {
    name: "Album"
    field {
      name: "title"
      number: 1
      label: LABEL_OPTIONAL
      type: TYPE_STRING
      json_name: "title"
    }
    field {
      name: "artist"
      number: 2
      label: LABEL_OPTIONAL
      type: TYPE_MESSAGE
      type_name: ".package_name.Artist"
      json_name: "artist"
    }
    field {
      name: "release_year"
      number: 3
      label: LABEL_OPTIONAL
      type: TYPE_INT32
      json_name: "releaseYear"
    }
  }
  syntax: "proto3"
}

Contoh kueri

Contoh berikut menunjukkan cara membuat kueri data protobuf menggunakan GoogleSQL untuk tabel eksternal Bigtable dan BigQuery.

Mentransmisikan kolom ke pesan protobuf

Anda dapat menggunakan operator CAST untuk menafsirkan nilai BYTES sebagai pesan protobuf. Untuk melakukannya, Anda harus memberikan nama lengkap pesan protobuf dalam format berikut: SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_MESSAGE_NAME.

Ganti kode berikut:

  • SCHEMA_BUNDLE_ID: ID unik yang Anda tetapkan ke paket skema saat Anda membuatnya.
  • FULLY_QUALIFIED_MESSAGE_NAME: Nama lengkap pesan, yang harus menyertakan nama paket yang ditentukan dalam file proto Anda–misalnya, package_name.message_name.

Contoh kueri berikut melakukan transmisi kolom album ke pesan protobuf Album. Pesan ini ditentukan dalam paket package_name dan merupakan bagian dari paket skema bernama bundle_name:

SELECT
  CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
  Music;

Mengakses kolom bertingkat

Anda dapat mengakses kolom bertingkat dalam pesan protobuf menggunakan notasi titik.

Kueri berikut mengambil nama artis dari pesan Artist bertumpuk dalam pesan Album:

SELECT
  CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name
FROM
  Music;

Memfilter berdasarkan kolom protobuf

Anda dapat menggunakan klausa WHERE untuk memfilter baris berdasarkan nilai kolom dalam pesan protobuf.

Kueri berikut memilih semua album dari artis Dana A.:

SELECT
  *
FROM
  Music
WHERE
  CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name = 'Dana A.';

Menggabungkan kolom protobuf

Anda dapat menggunakan fungsi agregat seperti SUM, AVG, MIN, MAX, dan COUNT pada kolom numerik dalam pesan protobuf Anda.

Kueri berikut menghitung tahun rilis rata-rata semua album dalam tabel:

SELECT
  AVG(CAST(album_details['album'] AS bundle_name.package_name.Album).release_year)
FROM
  Music;

Mengurutkan menurut kolom protobuf

Anda dapat menggunakan klausa ORDER BY untuk mengurutkan set hasil berdasarkan kolom dalam pesan protobuf Anda.

Kueri berikut mengambil semua album dan mengurutkannya berdasarkan tahun rilis dalam urutan menurun:

SELECT
  *
FROM
  Music
ORDER BY
  CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;

Penggunaan dengan tabel eksternal BigQuery

Anda dapat membuat kueri data protobuf yang disimpan di Bigtable dari BigQuery dengan membuat tabel eksternal. Saat membuat tabel eksternal, Anda menentukan jenis kolom sebagai JSON, encoding-nya sebagai PROTO_BINARY, dan mengaitkannya dengan paket skema. Proses ini mengonversi byte pesan protobuf menjadi data JSON yang setara, sehingga Anda dapat membuat kueri kolomnya secara langsung.

Berikut adalah contoh file definisi tabel untuk membuat tabel eksternal BigQuery di atas tabel Music:

{
    "sourceFormat": "BIGTABLE",
    "sourceUris": [
        "https://googleapis.com/bigtable/projects/PROJECT_ID/instances/INSTANCE_ID/tables/Music"
    ],
    "bigtableOptions": {
        "columnFamilies" : [
            {
                "familyId": "album_details",
                "columns": [
                    {
                        "qualifierString": "album",
                        "type": "JSON",
                        "encoding": "PROTO_BINARY",
                        "protoConfig": {
                            "schemaBundleId": "bundle_name",
                            "protoMessageName": "package_name.Album"
                        }
                    }
                ]
            }
        ]
    }
}

Setelah tabel eksternal dibuat, Anda dapat mengkueri data protobuf sebagai kolom JSON di BigQuery.

Kueri berikut mengambil judul semua album yang dirilis pada tahun 2022 dari tabel eksternal BigQuery:

SELECT JSON_VALUE(value, '$.title') AS title
FROM
`PROJECT_ID.DATASET.TABLE_NAME` AS t,
UNNEST(t.album_details.album.cell)
WHERE INT64(JSON_EXTRACT(value, '$.releaseYear')) = 2022;

Langkah berikutnya