Kueri tampilan terwujud berkelanjutan

Untuk membuat tampilan terwujud berkelanjutan dari tabel Bigtable, Anda menjalankan kueri SQL yang menentukan tampilan terwujud berkelanjutan.

Dokumen ini menjelaskan konsep dan pola untuk membantu Anda menyiapkan kueri SQL tampilan terwujud berkelanjutan. Sebelum membaca dokumen ini, Anda harus memahami Tampilan terwujud berkelanjutan dan GoogleSQL untuk Bigtable.

Tampilan terwujud berkelanjutan menggunakan sintaksis SQL terbatas. Pola berikut menunjukkan cara membuat kueri SQL tampilan terwujud berkelanjutan:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
GROUP BY expression [, ...];

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Jika Anda ingin membuat kueri SQL tampilan terwujud berkelanjutan sebagai indeks sekunder asinkron, gunakan klausa ORDER BY:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
ORDER BY expression [, ...];

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Kueri SQL yang menggunakan fungsi non-deterministik secara semantik berbeda dengan kueri tampilan terwujud berkelanjutan lainnya. Untuk mengetahui informasi selengkapnya, lihat bagian Kueri non-deterministik dalam dokumen ini.

Batasan kueri

Aturan berikut berlaku untuk kueri SQL yang digunakan untuk membuat tampilan terwujud berkelanjutan:

  • Harus berupa pernyataan SELECT.
  • Harus memiliki klausa GROUP BY atau, untuk kueri indeks sekunder asinkron, klausa ORDER BY, tetapi tidak keduanya.
  • Hanya boleh menggunakan fungsi agregasi yang didukung.
  • Dapat memiliki beberapa agregasi per grup.

Agregasi yang didukung

Anda dapat menggunakan fungsi agregasi berikut dalam kueri SQL yang menentukan tampilan terwujud berkelanjutan:

  • COUNT
  • SUM
  • MIN
  • MAX
  • HLL_COUNT.INIT
  • HLL_COUNT.MERGE
  • HLL_COUNT.MERGE_PARTIAL
  • ANY_VALUE
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • AVG

Jika Anda SELECT COUNT(*) Anda harus menentukan row key, seperti dalam contoh berikut:

SELECT
  '*' AS _key,
  COUNT(*) AS count
FROM
  foo
GROUP BY
  _key;

Fitur SQL yang tidak didukung

Anda tidak dapat menggunakan fitur SQL berikut:

  • Fitur apa pun yang tidak didukung oleh GoogleSQL untuk Bigtable
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME dan sebagian besar fungsi non-deterministik lainnya, dengan pengecualian.
  • DATE, DATETIME sebagai kolom output (Gunakan TIMESTAMP atau simpan string.)
  • Urutan DESC dalam output
  • Opsi DISTINCT, seperti dalam SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • SELECT *
  • Klausa OVER untuk membuat agregasi jendela
  • STRUCT

Anda juga tidak dapat menyusun klausa GROUP BY atau ORDER BY atau membuat kolom peta. Untuk batasan lainnya, lihat Batasan.

Menghindari baris yang dikecualikan

Baris input dikecualikan dari tampilan terwujud berkelanjutan dalam situasi berikut:

  • Lebih dari 1 MiB data dipilih dari baris. Misalnya, jika kueri Anda adalah SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples, maka baris apa pun yang berisi lebih dari 1 MiB data di kolom apple dan banana akan dikecualikan dari tampilan terwujud berkelanjutan.
  • Lebih dari 1 MiB data di-output dari baris. Hal ini dapat terjadi saat Anda menggunakan kueri seperti SELECT REPEAT(apple, 1000) atau menggunakan konstanta besar.
  • Data yang di-output lebih dari 10 kali lebih banyak daripada yang dipilih.
  • Kueri tidak cocok dengan data Anda. Hal ini mencakup upaya untuk membagi nol, overflow bilangan bulat, atau mengharapkan format row key yang tidak digunakan di setiap row key.

Baris yang dikecualikan akan meningkatkan metrik error pengguna saat pertama kali diproses. Untuk mengetahui informasi selengkapnya tentang metrik yang dapat membantu Anda memantau tampilan terwujud berkelanjutan, lihat Metrik.

Detail kueri

Bagian ini menjelaskan kueri tampilan terwujud berkelanjutan dan tampilan hasil saat kueri dijalankan. Data dalam tabel sumber adalah input, dan data hasil dalam tampilan terwujud berkelanjutan adalah output. Data output digabungkan atau tidak digabungkan (dalam kunci yang ditentukan).

Pernyataan SELECT

Pernyataan select mengonfigurasi kolom dan agregasi yang digunakan dalam tampilan terwujud berkelanjutan. Pernyataan harus menggunakan klausa GROUP BY untuk menggabungkan di seluruh baris atau klausa ORDER BY untuk membuat indeks sekunder asinkron.

SELECT * tidak didukung, tetapi SELECT COUNT(*) didukung.

Seperti dalam pernyataan SELECT biasa, Anda dapat memiliki beberapa agregasi per kumpulan data yang dikelompokkan. Kolom yang tidak dikelompokkan harus berupa hasil agregasi.

Berikut adalah contoh kueri agregasi GROUP BY standar dalam SQL:

SELECT
  myfamily["node"] AS node,
  myfamily["type"] AS type,
  COUNT(clicks) AS clicks_per_key
FROM
  mytable
GROUP BY
  node,
  type

Row key dan data yang tidak digabungkan

Anda dapat menentukan _key sebagai row key untuk tampilan terwujud berkelanjutan. Jika tidak, kolom dalam klausa GROUP BY akan membentuk kunci dalam tampilan.

Row key yang ditentukan oleh kolom _key

Anda dapat secara opsional menentukan kolom _key saat menentukan tampilan terwujud berkelanjutan. (Hal ini berbeda dengan _key kolom yang Anda dapatkan saat menjalankan kueri SQL pada tabel Bigtable.) Jika Anda menentukan _key, aturan berikut akan berlaku:

  • Anda harus mengelompokkan menurut _key, dan Anda tidak dapat mengelompokkan menurut hal lain kecuali (opsional) menurut _timestamp. Untuk mengetahui informasi selengkapnya, lihat Stempel waktu.
  • Kolom _key harus berjenis BYTES.

Menentukan _key berguna jika Anda berencana membaca tampilan dengan ReadRows, bukan dengan SQL, karena hal ini memberi Anda kontrol atas format row key. Di sisi lain, kueri SQL ke tampilan dengan _key yang ditentukan mungkin perlu mendekode _key secara eksplisit, bukan hanya menampilkan kolom kunci terstruktur.

Row key yang ditentukan oleh klausa GROUP BY atau ORDER BY

Jika Anda tidak menentukan _key, kolom yang tidak digabungkan dalam daftar SELECT akan menjadi row key dalam tampilan. Anda dapat menetapkan nama kolom kunci apa pun yang didukung oleh konvensi SQL. Gunakan pendekatan ini jika Anda berencana menggunakan SQL untuk menjalankan kueri tampilan, bukan permintaan ReadRows.

Kolom output yang tidak digabungkan dalam daftar SELECT harus disertakan dalam klausa GROUP BY. Urutan penulisan kolom dalam klausa GROUP BY adalah urutan penyimpanan data dalam row key tampilan terwujud berkelanjutan. Misalnya, GROUP BY a, b, c secara implisit adalah ORDER BY a ASC, b ASC, c ASC.

Jika Anda menggunakan klausa ORDER BY, bukan klausa GROUP BY untuk membuat indeks sekunder asinkron, kolom dalam daftar SELECT yang merupakan bagian dari klausa ORDER BY akan menjadi row key dalam tampilan. Urutan penulisan kolom dalam klausa ORDER BY adalah urutan penyimpanan data dalam row key tampilan terwujud berkelanjutan. Misalnya, ORDER BY a, b, c menyimpan data dengan row key yang diurutkan berdasarkan a ASC, lalu b ASC, lalu c ASC.

Filter SQL Anda harus menghilangkan potensi NULL atau nilai tidak valid lainnya yang dapat menyebabkan error. Baris yang tidak valid, seperti baris yang berisi kolom kunci NULL, akan dihilangkan dari hasil dan dihitung dalam metrik materialized_view/user_errors. Untuk men-debug error pengguna, coba jalankan kueri SQL di luar tampilan terwujud berkelanjutan.

Data gabungan

Kolom gabungan dalam kueri menentukan perhitungan yang menghasilkan data dalam tampilan terwujud berkelanjutan.

Alias untuk kolom gabungan diperlakukan sebagai penentu kolom dalam tampilan terwujud berkelanjutan.

Perhatikan contoh berikut:

SELECT
  fam["baz"] AS baz,
  SUM(fam["foo"]) AS sum_foo,
  SUM(fam["bar"]) AS sum_bar
FROM
  TABLE

GROUP BY
  baz;

Output kueri memiliki karakteristik berikut:

  • Output untuk setiap baz berada dalam baris terpisah dalam urutan baz ASC.
  • Jika baz tertentu memiliki setidaknya satu foo, sum_foo baris output adalah nilai non-NULL.
  • Jika baz tertentu memiliki setidaknya satu bar, sum_bar baris output adalah nilai non-NULL.
  • Jika baz tertentu tidak memiliki nilai untuk salah satu kolom, kolom tersebut akan dihilangkan dari hasil.

Kemudian, jika Anda menjalankan kueri tampilan dengan SELECT *, hasilnya akan terlihat mirip dengan berikut ini:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

Stempel waktu

Stempel waktu default untuk sel output dalam tampilan terwujud berkelanjutan adalah 0 (1970-01-01 00:00:00Z). Hal ini terlihat saat Anda membaca tampilan dengan ReadRows dan tidak terlihat saat Anda menjalankan kueri dengan SQL.

Untuk menggunakan stempel waktu yang berbeda dalam output, Anda dapat menambahkan kolom jenis TIMESTAMP ke daftar SELECT kueri dan memberinya nama _timestamp. Jika Anda menjalankan kueri tampilan terwujud berkelanjutan menggunakan ReadRows, _timestamp akan menjadi stempel waktu untuk sel lainnya dalam baris.

Stempel waktu tidak boleh NULL, harus lebih besar dari atau sama dengan nol, dan harus merupakan kelipatan 1.000 (presisi milidetik). Bigtable tidak mendukung stempel waktu sel yang lebih awal dari epoch Unix (1970-01-01T00:00:00Z).

Perhatikan contoh berikut, yang mengambil sampel ulang data gabungan menurut hari. Kueri menggunakan fungsi UNPACK.

SELECT
  _key,
  TIMESTAMP_TRUNC(_timestamp, DAY) AS _timestamp,
  SUM(sum_family["sum_column"]) AS sum_column,
  SUM(sum_family["foo"]) AS second_sum_column
FROM
  UNPACK(
  SELECT
    *
  FROM
    my_table(with_history => TRUE))
GROUP BY
  1,
  2

Jika SUM tertentu memiliki input yang tidak kosong untuk hari tertentu, baris output akan berisi nilai gabungan dengan stempel waktu yang cocok dengan hari yang dipangkas.

Jika Anda menjalankan kueri tampilan dengan SELECT *, hasilnya akan terlihat mirip dengan berikut ini:

_key _timestamp sum_column second_sum_column
1 2024-05-01 00:00:00Z 23 99
2 2024-05-02 00:00:00Z 45 201
3 2024-05-03 00:00:00Z NULL 56
4 2024-05-04 00:00:00Z 8 NULL

Kueri non-deterministik

Tampilan terwujud berkelanjutan mendukung fungsi SQL non-deterministik berikut .

Fungsi atribut cluster

Fungsi CLUSTER_ATTRIBUTE() memungkinkan Anda mengakses metadata secara terprogram tentang cluster Bigtable yang menjalankan kueri tampilan terwujud berkelanjutan. Atribut cluster_id menampilkan ID string cluster yang memproses tampilan.

Mengisolasi tampilan ke satu cluster

Untuk mengisolasi komputasi dan penyimpanan tampilan terwujud berkelanjutan ke satu cluster, seperti cluster pelaporan atau analisis khusus, bandingkan CLUSTER_ATTRIBUTE('cluster_id') dengan literal string konstanta yang berisi ID cluster:

SELECT
  metrics['sensor_id'] AS sensor_id,
  COUNT(1) AS reading_count
FROM `TABLE_ID`
WHERE CLUSTER_ATTRIBUTE('cluster_id') = 'CLUSTER_ID'
GROUP BY 1

Ganti kode berikut:

  • TABLE_ID: ID unik tabel Bigtable.
  • CLUSTER_ID: ID cluster tempat Anda ingin mewujudkan tampilan.

Kueri ini berperilaku sebagai berikut di seluruh instance Anda:

  • Cluster yang ditetapkan: Di cluster yang cocok dengan CLUSTER_ID, kondisi WHERE akan dievaluasi ke true. Bigtable menggabungkan semua data dari tabel sumber, terlepas dari cluster mana yang menyerap atau mereplikasinya, dan mewujudkan data tersebut dalam salinan tampilan cluster tersebut.
  • Cluster lainnya: Di semua cluster lain dalam instance, CLUSTER_ATTRIBUTE('cluster_id') akan dievaluasi ke ID cluster masing-masing, sehingga kondisi WHERE menjadi false. Cluster tersebut tidak menghitung atau menyimpan baris apa pun untuk tampilan terwujud berkelanjutan, yang menghemat resource komputasi dan penyimpanan.

Memfilter data menurut asal cluster

Jika aplikasi Anda menulis metadata cluster ke dalam baris tabel sumber—misalnya, dalam kolom bernama origin_cluster, Anda dapat mencocokkan cluster asal baris dengan cluster pemrosesan:

SELECT
  metrics['sensor_id'] AS sensor_id,
  COUNT(1) AS reading_count
FROM `TABLE_ID`
WHERE metrics['origin_cluster'] = CLUSTER_ATTRIBUTE('cluster_id')
GROUP BY 1

Dalam kueri ini, metrics['origin_cluster'] adalah properti data yang disimpan dalam baris, sedangkan CLUSTER_ATTRIBUTE('cluster_id') adalah properti cluster yang memproses tampilan. Replika tampilan terwujud berkelanjutan setiap cluster hanya menggabungkan baris tempat origin_cluster yang disimpan cocok dengan ID cluster tersebut.

Jika beberapa baris mungkin tidak memiliki cluster asal yang ditentukan, Anda dapat menggunakan IF_NULL untuk menetapkan cluster pengganti:

SELECT
  metrics['sensor_id'] AS sensor_id,
  COUNT(1) AS reading_count
FROM `TABLE_ID`
WHERE IF_NULL(metrics['origin_cluster'], 'DEFAULT_CLUSTER_ID') = CLUSTER_ATTRIBUTE('cluster_id')
GROUP BY 1

Karakteristik kueri

Kueri yang menggunakan CLUSTER_ATTRIBUTE memiliki karakteristik berikut:

  • Karena sensor_id berada dalam klausa GROUP BY, kolom tersebut akan menjadi bagian dari row key dalam tampilan terwujud berkelanjutan.
  • Untuk menggunakan fungsi non-deterministik ini, Anda harus menetapkan flag ignore_warnings ke true saat membuat tampilan. Untuk mengetahui informasi selengkapnya, lihat Membuat tampilan terwujud berkelanjutan.

Saat Anda menjalankan kueri tampilan dengan SELECT *, hasilnya akan terlihat mirip dengan berikut ini:

sensor_id reading_count
sensor-1234 25
sensor-5678 68

Batasan

Penggunaan fungsi CLUSTER_ATTRIBUTE non-deterministik memperkenalkan persyaratan perutean yang ketat:

  • Perutean multi-cluster tidak didukung: Karena output fungsi bergantung pada cluster fisik yang menjalankan kueri, perutean multi-cluster akan menghasilkan hasil non-deterministik.
  • Gunakan perutean cluster tunggal: Saat menjalankan kueri tampilan terwujud berkelanjutan yang menggunakan CLUSTER_ATTRIBUTE, gunakan profil aplikasi yang dikonfigurasi untuk perutean cluster tunggal.
  • Rute ke cluster yang ditetapkan: Jika Anda mengisolasi tampilan ke cluster tertentu, seperti WHERE CLUSTER_ATTRIBUTE('cluster_id') = 'my-reporting-cluster', arahkan profil aplikasi langsung ke cluster tersebut. Menjalankan kueri cluster lain akan menampilkan hasil kosong karena tampilan tidak diisi di cluster lain.

Encoding

Jika Anda menjalankan kueri tampilan terwujud berkelanjutan dengan SQL, Anda tidak perlu mengetahui cara nilai gabungan dienkode karena SQL mengekspos hasilnya sebagai kolom yang diketik.

Jika Anda membaca dari tampilan menggunakan ReadRows, Anda harus mendekode data gabungan dalam permintaan baca. Untuk mengetahui informasi selengkapnya tentang permintaan ReadRows, lihat Pembacaan.

Nilai gabungan dalam tampilan terwujud berkelanjutan disimpan menggunakan encoding yang dijelaskan dalam tabel berikut, berdasarkan jenis output kolom dari definisi tampilan.

Jenis Encoding
BOOL Nilai 1 byte, 1 = benar, 0 = salah
BYTES Tidak ada encoding
INT64 (atau INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) Big-endian 64-bit
FLOAT64 IEEE 754 64-bit, tidak termasuk NaN dan +/-inf
STRING UTF-8
TIME/TIMESTAMP Bilangan bulat 64-bit yang mewakili jumlah mikrodetik sejak epoch Unix (konsisten dengan GoogleSQL)
Untuk mengetahui informasi selengkapnya, lihat Encoding dalam referensi Data API.

Langkah berikutnya