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 BYatau, untuk kueri indeks sekunder asinkron, klausaORDER 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:
COUNTSUMMINMAXHLL_COUNT.INITHLL_COUNT.MERGEHLL_COUNT.MERGE_PARTIALANY_VALUEBIT_ANDBIT_ORBIT_XORAVG
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
ARRAYARRAY_AGGARRAY_CONCAT_AGGCOUNT_IFCURRENT_TIMEdan sebagian besar fungsi non-deterministik lainnya, dengan pengecualian.DATE,DATETIMEsebagai kolom output (GunakanTIMESTAMPatau simpan string.)- Urutan
DESCdalam output - Opsi
DISTINCT, seperti dalamSUM(*DISTINCT* value)) LIMIT/OFFSETSELECT *- Klausa
OVERuntuk 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 kolomappledanbananaakan 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
_keyharus berjenisBYTES.
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
bazberada dalam baris terpisah dalam urutanbaz ASC. - Jika
baztertentu memiliki setidaknya satufoo,sum_foobaris output adalah nilai non-NULL. - Jika
baztertentu memiliki setidaknya satubar,sum_barbaris output adalah nilai non-NULL. - Jika
baztertentu 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, kondisiWHEREakan dievaluasi ketrue. 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 kondisiWHEREmenjadifalse. 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_idberada dalam klausaGROUP BY, kolom tersebut akan menjadi bagian dari row key dalam tampilan terwujud berkelanjutan. - Untuk menggunakan fungsi non-deterministik ini, Anda harus menetapkan flag
ignore_warningsketruesaat 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) |
Langkah berikutnya
- Membuat dan mengelola tampilan terwujud berkelanjutan
- Dokumentasi referensi GoogleSQL untuk Bigtable