BigQuery-nin Boru Sintaksisi: SQL-i daha asan, daha sürətli və daha oxunaqlı etmək

Kiminlə işləyibsə SQL onunla gələn sevgi-nifrət münasibətini bilir. SQL güclü, standartlaşdırılmış və ifadəlidir, lakin eyni zamanda miqyasda oxumaq və saxlamaq üçün ən qeyri-intuitiv dillərdən biridir. Sorğunuz nə qədər dərin olarsa, əslində nə baş verdiyini və hansı ardıcıllıqla baş verdiyini anlamaq bir o qədər çətinləşir.
Bunun səbəbi SQL-in düşündüyünüz ardıcıllıqla axmamasıdır. Yazmaqla başlayırsınız SELECT, lakin verilənlər bazası əslində bunu ilk dəfə emal etmir. Mühərrik ilə başlayır FROM bəndinə daxil olur, sonra verilənlərə qoşulur, onu süzür, ümumiləşdirir və yalnız sonra çeşidləmə və proyeksiya tətbiq edir. Nəticə yazılmış bir sorğudur geri icra üsuluna nisbətən.
Sintaksis və icra arasındakı bu uyğunsuzluq SQL-i həm idrak baxımından ağır, həm də hesablama baxımından bahalı edir. Analitiklər çox vaxt alt sorğulara və ya Ümumi Cədvəl İfadələrinə (CTE-lər) lazımsız mürəkkəblik və artıqlıq əlavə edərək yuxarıdan aşağıya axını simulyasiya etmək. Hətta təcrübəli istifadəçilər həll etdikləri problemə diqqət yetirmək əvəzinə məntiqin iç-içə bloklarını düzəldirlər.
Bunu həll etmək üçün BigQuery supports1s oxunduqları ardıcıllıqla yerinə yetirilir. Məntiqi içəridən yazmaq əvəzinə, onu addım-addım, məsələn, məlumat kəməri kimi yazırsınız - hər bir sətir fərqli bir transformasiyanı təmsil edir. Nəticə daha asan başa düşülən, sazlanması daha asan və müasir verilənlərin təhlili üçün daha intuitiv olan SQL-dir.

Yuxarıdakı şəkil boru sintaksisinin həll etdiyi əsas problemi göstərir. Ənənəvi SQL-də sintaktik sıra (sorğunu necə yazırsınız) ilə səhv uyğunlaşdırılıb semantik sıra (verilənlər bazası əslində onu necə emal edir). Məsələn, SELECT yuxarıda görünür, lakin qoşulma, filtrləmə, qruplaşdırma və çeşidləmə tamamlanana qədər mühərrik onu qiymətləndirmir.
Bu ardıcıllıq BigQuery boru sorğusunun məntiqi və sintaktik axınını - yuxarıdan aşağıya, soldan sağa - verilənlər bazasının məlumatları necə emal etdiyini əks etdirir.
- FROM: İstənilən boru sorğusunun başlanğıc nöqtəsi. Məlumatların axdığı ilkin cədvəli və ya alt sorğunu müəyyən edir. Boru sintaksisində,
FROMetibarlı sorğu kimi tək dayana bilər və ardıcıl boru xəttinə giriş kimi çıxış edir. - QOŞULUN: Cari cədvəli başqa cədvəldən və ya alt sorğudan əlavə sütun və sətirlərlə genişləndirir. Ardıcıl olaraq bir neçə dəfə istifadə edilə bilər (
|> JOIN table USING (key)), sol-dərin birləşmə ağaclarını iç içə alt sorğular olmadan oxunaqlı etmək. - Dəst: Mövcud sütun dəyərlərini yerində yeniləyir (
|> SET column = expression). kimi funksiyalarSELECT * REPLACE(...)standart SQL-də, lakin boru kəməri addımı kimi istifadə edildikdə daha oxunaqlı və moduldur. - UZATIN: Mövcud verilənlər bazasına hesablanmış sütunlar əlavə edir (
|> EXTEND expression AS new_column). SELECT * kimi, standart SQL-də new_column, lakin birləşmələr və filtrlər kimi digər əməliyyatlar arasında əldə edilmiş sahələrin artımlı yaradılmasına imkan verir. - DAMCI: Cari verilənlər dəstindən bir və ya bir neçə sütunu silir (
|> DROP column_name). bərabərdirSELECT * EXCEPT(column)standart SQL-də və tez-tez çıxışı sadələşdirmək və ya aralıq məlumat ölçüsünü azaltmaq üçün istifadə olunur. - Harada olursunuzsa olun: Şərti təmin edən sətirləri filtrləyir (
|> WHERE condition). HAVING və QUALFY kimi müxtəlif açar sözlərə ehtiyacı aradan qaldıraraq, birləşmədən əvvəl və ya sonra boru kəmərinin istənilən yerində görünə bilər. - QREQƏT: Tam cədvəl və ya qruplaşdırılmış toplamaları yerinə yetirir (
|> AGGREGATE SUM(column) AS total GROUP BY category). SELECT daxilində GROUP BY və aqreqasiya funksiyalarını əvəz edir, sintaksisi sadələşdirir və onu əməliyyatların məntiqi sırasına uyğunlaşdırır. - SİFARİŞ: Sətirləri artan və ya azalan qaydada çeşidləyir (
|> ORDER BY column DESC). kimi operatorlar tərəfindən izlənilə bilən sifarişli nəticə cədvəli yaradırLIMIT. - LIMIT: Nəticədə sətirlərin sayını məhdudlaşdırır (
|> LIMIT 10). Sonra işləyirORDER BYvə ya süzgəclərin və aqreqasiyaların təbii ardıcıllığını qoruyaraq sıralanmamış cədvəllərdə. - ZƏNG: Cari cədvəldən giriş kimi istifadə edərək cədvəl dəyərli funksiyanı və ya maşın öyrənmə modelini icra edir (
|> CALL ML.PREDICT(MODEL project.model_name)). Xətti və oxuna bilən iş axını yaradaraq, daxili funksiya çağırışlarına ehtiyacı aradan qaldırır. - SEÇİM: Çıxışa daxil ediləcək sütunların son proyeksiyasını müəyyən edir (
|> SELECT column1, column2). Sona bənzər bir boru kəmərində bağlanma əməliyyatı kimi xidmət edirSELECTstandart SQL sorğusunda.
Aşağıda boru sintaksisinin SQL məntiqini sadələşdirdiyi, sorğuları daha təmiz və işləməyi sürətləndirdiyi ən ümumi ssenarilər verilmişdir.
Alt sorğular olmadan məlumatların toplanması
Aqreqasiyalar SQL-in içəridə hiss etməyə başladığı yerdir. Əgər nəyisə saymaq istəyirsənsə, o sayları say, birdən mötərizədə cəhənnəmin içində olursan.
SQL
SELECT c_count, COUNT(*) AS custdist
FROM (
SELECT c_custkey, COUNT(o_orderkey) AS c_count
FROM customer
JOIN orders ON c_custkey = o_custkey
WHERE o_comment NOT LIKE '%unusual%packages%'
GROUP BY c_custkey
)
GROUP BY c_count
ORDER BY custdist DESC; Boru sintaksisi
FROM customer
|> JOIN orders ON c_custkey = o_custkey
AND o_comment NOT LIKE '%unusual%packages%'
|> AGGREGATE COUNT(o_orderkey) AS c_count GROUP BY c_custkey
|> AGGREGATE COUNT(*) AS custdist GROUP BY c_count
|> ORDER BY custdist DESC; Artıq yuvalama və ya ikiqat qruplaşma yoxdur. Hər bir addım məntiqi şəkildə axır və bütün sorğunu yenidən yazmadan müstəqil şəkildə dəyişdirilə bilər.
Sütunların Addım-addım təmizlənməsi və dəyişdirilməsi
Mətni kiçik hərflərlə yazmaq, ümumiləri hesablamaq və əlavə sütunları buraxmaq lazım olduqda, standart SQL sizi birdən çox mətni yenidən yazmağa məcbur edir. SELECT bəyanatlar. Boru sintaksisi təqdim edir SET, EXTENDvə DROP operatorları istifadə edərək, dəyişiklikləri ardıcıllıqla tətbiq edə bilərsiniz.
SQL
SELECT o_custkey, ROUND(o_totalprice) AS total_price
FROM (
SELECT
o_custkey,
o_totalprice,
LOWER(o_orderstatus) AS o_orderstatus
FROM orders
)
WHERE total_price > 1000; Boru sintaksisi
FROM orders
|> SET o_orderstatus = LOWER(o_orderstatus)
|> EXTEND ROUND(o_totalprice) AS total_price
|> WHERE total_price > 1000
|> SELECT o_custkey, total_price; Hər bir əməliyyat əvvəlki əməliyyat üzərində qurulur, bu da transformasiyaları izləməyi və məntiqdən təkrar istifadə etməyi asanlaşdırır.
Toplamadan sonra "VAR" ı xatırlamadan filtrləmə
SQL-in qəribəliklərindən biri filtrlərin vaxtının bənddən asılı olaraq dəyişməsidir. istifadə edirsən WHERE qruplaşdırmadan əvvəl və HAVING sonra, lakin əslində, hər ikisi sadəcə sətirləri süzür. Boru sintaksisi istifadə etməyə imkan verir WHERE ardıcıl olaraq, harada yerləşdirməyinizdən asılı olmayaraq.
SQL
SELECT department, COUNT(*) AS emp_count
FROM employees
WHERE active = TRUE
GROUP BY department
HAVING COUNT(*) > 5; Boru sintaksisi
FROM employees
|> WHERE active = TRUE
|> AGGREGATE COUNT(*) AS emp_count GROUP BY department
|> WHERE emp_count > 5; İndi siz onlar haqqında düşündüyünüz ardıcıllıqla filtrləri yaza bilərsiniz: əvvəlcə məlumatları süzün, sonra qruplaşdırın, sonra nəticələr üzrə yenidən filtrləyin.
Müvəqqəti Cədvəllər Olmadan Sorğuların Sazlanması
Standart SQL-də aralıq nəticənin yoxlanılması ya müvəqqəti cədvəlin yaradılmasını, ya da kodun çoxsaylı CTE-lərə sarılmasını tələb edir. Boru sintaksisi ilə siz sorğunu boru kəmərinin istənilən nöqtəsinə qədər icra edə bilərsiniz.
SQL
WITH filtered AS (
SELECT * FROM orders WHERE o_totalprice > 500
),
summed AS (
SELECT o_custkey, SUM(o_totalprice) AS total
FROM filtered GROUP BY o_custkey
)
SELECT * FROM summed WHERE total > 10000; Boru sintaksisi
FROM orders
|> WHERE o_totalprice > 500
|> AGGREGATE SUM(o_totalprice) AS total GROUP BY o_custkey
|> WHERE total > 10000; Sorğunun hər bir prefiksi öz-özünə yerinə yetirilə bilər, yəni siz istənilən mərhələdə məlumatlara “baxa bilərsiniz”. Bu, sazlamaq və təkrarlamaq üçün daha təmiz, daha interaktiv bir yoldur.
Yuvalamadan Zəncirləmə Modelləri və Funksiyaları
Cədvəllə qiymətləndirilən funksiyalar və ya BigQuery ML modelləri ilə işləyərkən yuvalama tez oxunmaz ola bilər. Boru sintaksisi bu yuvalanmış zəngləri CALL istifadə edərək xətti zəncirləmə ilə əvəz edir.
SQL
SELECT *
FROM ML.PREDICT(
MODEL `project.sentiment_model`,
(SELECT text FROM reviews)
); Boru sintaksisi
SELECT text FROM reviews
|> CALL ML.PREDICT(MODEL `project.sentiment_model`); Birdən çox model və ya transformasiya tətbiq etsəniz, sadəcə olaraq əlavə ZƏNG sətirləri yığırsınız - mötərizə tələb olunmur.
İçəri daxil edilmiş seçimlər olmadan məlumatların fırlanması
Məlumatların döndərilməsi həmişə yorucu proses olub, çox vaxt alt sorğuların təbəqələrini tələb edir. Boru sintaksisi onu bir axan ardıcıllıqla sadələşdirir.
SQL
SELECT *
FROM (
SELECT n_name, c_acctbal, c_mktsegment
FROM customer JOIN nation USING (n_nationkey)
)
PIVOT(SUM(c_acctbal) FOR n_name IN ('PERU', 'KENYA', 'JAPAN')); Boru sintaksisi
FROM customer
|> JOIN nation USING (n_nationkey)
|> SELECT n_name, c_acctbal, c_mktsegment
|> PIVOT(SUM(c_acctbal) FOR n_name IN ('PERU', 'KENYA', 'JAPAN')); Sorğu indi hekayə kimi oxunur: məlumatlarınızla başlayın, ona qoşulun, lazım olanı seçin, sonra döndərin.
Niyə Boru Sintaksisi Oyun Dəyişdiricidir
Boru sintaksisi SQL-i yenidən kəşf etmir - onu aydınlaşdırır. O, SQL-in deklarativ strukturu ilə bağlı güclü olan hər şeyi qoruyur, lakin məntiqi geriyə yazmaq üçün koqnitiv yükü aradan qaldırır.
Məlumat alimləri, analitiklər və mühəndislər üçün bu o deməkdir:
- Sorğuları oxumaq, yazmaq və sazlamaq daha asandır
- Sadə tapşırıqlar üçün alt sorğular və ya CTE ilə hoqqalara daha çox ehtiyac yoxdur
- Əslində necə düşündüyünüzü əks etdirən sadələşdirilmiş məntiq
- Daha yaxşı performans və daha az lazımsız əməliyyatlar
BigQuery-nin boru sintaksisi müasir verilənlər dövrü üçün SQL-dir - xətti, intuitiv və real dünya analitikası üçün optimallaşdırılmışdır.


