Přednáška (kinda workshop) nabídne 10 užitečných tipů pro efektivní využití BigQuery. Dozvíte se, jak optimalizovat dotazy a snížit náklady na provoz, využít uživatelsky definované funkce, identifikovat, kdo může za vysoké náklady na provoz BigQuery, automaticky detekovat anomálie nebo predikovat budoucnost. Vše představím na konkrétních příkladech včetně ukázek kódů.
6. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
7. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
10. 1. Jak na základní optimalizaci? Premisy
Tipy
1. Partitioning tabulky dle date
2. Clustering dle event_name
3. BigQuery = Sloupcová databáze
(čím míň sloupců chci, tím méně to stojí)
11. 1. Jak na základní optimalizaci? Final tuning
Tipy
1. Při selectování dat z GA4 datasetu používejte _TABLE_SUFFIX místo event_date
LIMIT = 10 na konci SQL nic nezlevní
2. INT64 je levnější (a rychlejší) než STRING
3. Nebojte se číselných datových typů
→ existuje SAFE_CAST(), nespadne to …
-- Tento select stojí 0 Kč
SELECT
PARSE_DATE("%Y%m%d", _TABLE_SUFFIX) AS event_date,
COUNT(*) AS event_count
FROM
`analytics_XXXXXXXXX.events_*`/* <-- GA4 DATASET */
WHERE
_TABLE_SUFFIX IS NOT NULL
GROUP BY 1;
--
-- Tento select stojí klidně desítky Kč
SELECT
event_date,
COUNT(*) AS event_count
FROM
`analytics_XXXXXXXXX.events_*`/* <-- GA4 DATASET */
GROUP BY 1
LIMIT 10;
12. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
13. 2. Pár tipů při psaní SQL | Hromadný kurzor
Tipy
Geniální pro hromadné úpravy více řádků - šetří spoustu času
14. 2. Pár tipů při psaní SQL | F1 je kámoš
Tipy
Opět skvělé pro hromadné úpravy většího množství textu
15. 2. Pár tipů při psaní SQL | CTRL (CMD ⌘) + Klik
Tipy
Prokliknutí detailu tabulky (musí být v závorkách ``)
16. 2. Pár tipů při psaní SQL | Historie SQL
Tipy
- Personal history
- Project history
Výsledky (results) každé query jsou uložené 24h
Samotné query jsou uložené měsíce
17. 2. Pár tipů při psaní SQL | Nepište jak 🐷
Tipy
18. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
19. 3. Nebojím se nákladů za BigQuery: Ceník
Query:
- 6.25 USD / zprocesovaný TB
- První TB měsíčně je zdarma
Úložiště
- Active logical storage: 23 USD / TB / měsíc
- Prvních 10 GB měsíčně zdarma
- Long-term logical storage 16 USD / TB / měsíc
- Prvních 10 GB měsíčně zdarma
- Long-term = data nebyla změněna alespoň 90 dní
(k 19.10.2023)
Tipy
20. Quotas (limit):
1 TB / denně / projekt
… max 6.25 USD / denně
… max 4 400 Kč / měsíčně
3. Nebojím se nákladů za BigQuery: Quotas
Tipy
21. 3. Nebojím se nákladů za BigQuery: Notifikace
Tipy
V rámci Billingu se dají nastavit notifikace na email, při překročení určité částky v daném měsíci.
22. -- Dotaz ukáže, kdo za posledních 31 dní (a čím) vytížil nejvíce databázi
WITH
dates AS (
SELECT
DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY) AS last_month,
CURRENT_DATE() AS today
)
SELECT
info.project_id,
user_email || COALESCE(" - (" || (SELECT l.value FROM UNNEST(labels) l WHERE l.key = 'requestor') || ")", "") AS user,
info.job_type,
COUNT(info.job_type) AS queries_counter,
ROUND(SUM(CAST(info.total_bytes_billed / 1024 / 1024 / 1024 AS FLOAT64)), 0) || ' GB' AS data_billed,
ROUND(SUM(CAST(info.total_bytes_billed / 1024 / 1024 / 1024 AS FLOAT64)) * 0.00625, 0) || ' USD' AS cost, -- $6.25 per TB
ROUND(SUM(DATETIME_DIFF(DATETIME(info.end_time), DATETIME(info.start_time), SECOND)) / 60) || ' minutes' AS run_time
FROM
`region-eu`.INFORMATION_SCHEMA.JOBS_BY_PROJECT info,
dates
WHERE
DATE(info.creation_time) BETWEEN dates.last_month AND dates.today
GROUP BY
1, 2, 3
ORDER BY
SUM(info.total_bytes_billed) DESC;
3. Nebojím se nákladů za BigQuery: Stalking
Tipy
Dokumentace
23. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
24. -- Vytvoření EU Datasetu
CREATE SCHEMA IF NOT EXISTS `common`
OPTIONS(
description="Dataset pro globálně používané funkce a procedury.",
location="eu");
--
-- getURLParametr
CREATE OR REPLACE FUNCTION `common.getURLParameter`(url STRING, parameter STRING) AS ((
SELECT REGEXP_EXTRACT(url, r'[?&]'||parameter||'=([^&]+)')
));
--
-- URL Decode:
CREATE OR REPLACE FUNCTION `common.URLDecode`(url STRING) AS ((
SELECT SAFE_CONVERT_BYTES_TO_STRING(
ARRAY_TO_STRING(
ARRAY_AGG(
IF(STARTS_WITH(y, '%'), FROM_HEX(SUBSTR(y, 2)), CAST(y AS BYTES)) ORDER BY i
),
b'')
)
FROM UNNEST(REGEXP_EXTRACT_ALL(url, r"%[0-9a-fA-F]{2}|[^%]+")) AS y WITH OFFSET AS i
));
4. Uživatelské funkce a procedury | Vytvoření
Tipy
1) Vytvoření Datasetu
2) Vytvoření funkce
getURLParametr
3) Vytvoření funkce
URLDecode
Vstupní parametry funkce
26. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
27. Tabulky v BQ mohou mít dva
typy expirace:
1) Celkové tabulky
(tabulka se v čase celá smaže)
2) Partitioningu
(tabulka se postupně odmazává)
5. Expirace tabulek | Co a kde to je?
Tipy
28. Při založení Google Cloud Projektu
bez Billing účtu je defaultní expirace
tabulek (a datasetů) 60 dní.
-> Data vydrží max 60 dnů!
2 řešení:
1) Před založením datasetů a tabulek
nejdříve založit / přiřadit Billing účet
2) Ohlídat si to při přidávání Billing účtu
5. Expirace tabulek | Začátečnický fuckup
Tipy
29. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
30. 6. Time travel - vymazaná tabulka? Není problém!
Workshop
SELECT
event_name
FROM
dataset_name.table_name
FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR); Dokumentace
Při změně tabulky stačí SQL
Při vymazání tabulky musí člověk do Cloud Shellu
* Lze až 7 dní do minulosti ~ 604 799 000 milisekund
31. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
33. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
34. Umožňuje sledovat:
- Jak vznikla tabulka
- Jaké má návaznosti
Predispozice:
Zapnuté Data Lineage API
Cena:
Prvních 1000 API callů zdarma
Potom $0.0005 per API call.
8. Data Lineage | K čemu to je dobrý?
Tipy
35. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
36. CREATE SCHEMA IF NOT EXISTS `project_name.ml_models`
OPTIONS(
description="Dataset pro machine learning (AI) modely.",
location="eu");
--
CREATE OR REPLACE MODEL `ml_models.event_count_anomaly_detector`
OPTIONS (
model_type='arima_plus',
TIME_SERIES_DATA_COL='event_count',
TIME_SERIES_TIMESTAMP_COL='event_date',
HOLIDAY_REGION='CZ')
AS (
SELECT
PARSE_DATE("%Y%m%d", _TABLE_SUFFIX) AS event_date,
COUNT(*) AS event_count
FROM
`analytics_XXXXXXXXX.events_*`/* <-- SEM VLOŽTE GA4 DATASET */
WHERE
_TABLE_SUFFIX IS NOT NULL
GROUP BY 1);
------------------------------------------------
SELECT
*
FROM
ML.DETECT_ANOMALIES(
MODEL ml_models.event_count_anomaly_detector,
STRUCT (0.95 AS anomaly_prob_threshold)) -- Při 95 % = anomálie
ORDER BY event_date DESC;
9. Detekce anomálií v datech | celkový počet událostí GA4
Tipy
* Téměř zdarma
37. 9. Detekce anomálií v datech | individuální události
Tipy
CREATE OR REPLACE MODEL `ml_models.specific_event_count_anomaly_detector`
OPTIONS (
MODEL_TYPE='arima_plus',
TIME_SERIES_DATA_COL='event_count',
TIME_SERIES_TIMESTAMP_COL='event_date',
TIME_SERIES_ID_COL='event_name',
HOLIDAY_REGION='CZ')
AS (
SELECT
PARSE_DATE("%Y%m%d", _TABLE_SUFFIX) AS event_date,
event_name,
COUNT(*) AS event_count
FROM
`analytics_XXXXXXXXX.events_*`/* <-- SEM VLOŽTE GA4 DATASET */
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 31 DAY))
AND FORMAT_DATE("%Y%m%d", DATE_SUB(CURRENT_DATE(), INTERVAL 2 DAY))
GROUP BY 1, 2);
------------------------------------------------
SELECT
*
FROM
ML.DETECT_ANOMALIES(
MODEL ml_models.specific_event_count_anomaly_detector,
STRUCT (0.95 AS anomaly_prob_threshold)) -- Při 95 % = anomálie
ORDER BY event_date DESC, event_count DESC;
* Pozor, tohle už něco stojí! :-)
38. 10 tipů, jak pracovat s BigQuery
1. Jak na základní optimalizaci?
2. Pár tipů při psaní queries
3. Nebojím se nákladů za BigQuery
4. Uživatelské funkce a procedury jsou super
5. Expirace tabulek může být super
6. Time travel - vymazaná tabulka? Není problém!
7. Externí zdroje do BigQuery
8. Data Lineage
9. ML - Detekce anomálií v datech
10. ML - Analýza sentimentu v datech
39. 10. Analýza sentimentu | Bard (PaLM 2)
Tipy
-- Step 1: Povolte "BigQuery connection API" a "Vertex AI API"
-- Step 2: Vytvořte external connection v USA "ml_models" https://cloud.google.com/bigquery/docs/create-cloud-resource-connection#console
--
CREATE SCHEMA IF NOT EXISTS `ml_models_us`
OPTIONS(
description="Dataset pro machine learning (AI) modely v USA.",
location="us");
--
CREATE MODEL IF NOT EXISTS `ml_models_us.llm_model`
REMOTE WITH CONNECTION `us.ml_models`
OPTIONS(remote_service_type = 'CLOUD_AI_LARGE_LANGUAGE_MODEL_V1');
--
WITH
testovaci_texty AS (
SELECT "Perfektní pořady , které jinde nejsou. Škoda ale , že přehrávání na androidu je na malém okně a musím se na to dívat z 20 cm." AS review
)
SELECT
review,
JSON_VALUE(ml_generate_text_result, '$.predictions[0].content') AS sentiment
FROM
ML.GENERATE_TEXT(
MODEL `ml_models_us.llm_model`,
(
SELECT
CONCAT('Perform sentiment analysis on the following text, return one the following categories "positive", "negative", "neutral": ', review) AS prompt,
review
FROM
testovaci_texty
),
STRUCT(
0.3 AS temperature,
100 AS max_output_tokens
)
);