1. 簡介
結構化查詢語言 (SQL) 是資料倉儲分析的業界標準。不過,以純 SQL 表示複雜的程序邏輯、數學運算、文字清理或機器學習準備工作流程,可能非常困難。
過去,資料團隊需要複雜的自訂 Python 處理作業時,會從 BigQuery 擷取大量資料集,在外部自訂虛擬機器或叢集中處理,然後將結果載回。這種做法會造成網路延遲時間過長,而且資料遷移會增加法規遵循風險,還會產生基礎架構管理負擔。
BigQuery 代管 Python 使用者定義函式 (UDF) 會在無伺服器資源上執行自訂程式碼,自動擴充至數百萬列,解決這些問題。Google Cloud 會管理編譯、映像檔建構、安全性修補和執行作業,讓您直接在資料所在位置執行自訂計算。
在本程式碼研究室中,您將在 StackOverflow 社群資料上建構分析和文字前處理管道,為後續的報表和機器學習作業做好準備。
必要條件
- 已啟用計費功能的 Google Cloud 專案。
- 對 SQL、IAM 和 BigQuery 概念有基本瞭解。
課程內容
- 如何對公開資料集呼叫預先編譯的公開 Python UDF,以分析資料分布情形。
- 如何使用
beautifulsoup4部署自訂 Python UDF,以便清除非結構化資料。 - 瞭解如何設定 BigQuery Cloud 資源連結,安全地下載機器學習資產,並使用記憶體內容器快取,透過 Hugging Face Transformers 程式庫執行本機機器學習斷詞。
- 如何將這些步驟串連成單一的高效能 SQL 管道。
2. 設定和需求條件
啟動 Cloud Shell
雖然可以透過筆電遠端操作 Google Cloud,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是可在雲端執行的指令列環境。
- 前往 Google Cloud 控制台,然後選取或建立 Google Cloud 專案。
- ⚠️ 請記下專案 ID。您會在整個實驗室中使用這個變數。

- 在新分頁中開啟 Cloud Shell:https://shell.cloud.google.com/。
- 如果出現提示訊息,請按一下「授權」。
- 取代
PROJECT_ID,然後將下列指令貼到終端機:
cat << 'EOF' > env.sh
#!/bin/bash
# env.sh: Environment variables for BigQuery Python UDFs codelab
# ⚠️ Replace 'YOUR_PROJECT_ID' with your actual Google Cloud Project ID
export PROJECT_ID="YOUR_PROJECT_ID"
export REGION="us"
export BQ_DATASET="python_udfs"
export BQ_RESOURCE_CONN="external_api_connection"
EOF
將變數套用至有效工作階段:
source ./env.sh
啟用 API 並建立 BigQuery 資料集
在專案中啟用必要的 Google Cloud 服務,並建立目標資料集:
# Enable API Services
gcloud services enable \
bigquery.googleapis.com \
bigqueryconnection.googleapis.com --quiet
# Create BigQuery Dataset
bq mk --location=${REGION} --dataset ${PROJECT_ID}:${BQ_DATASET}
3. 使用公開 Python UDF 探索資料分布情形
部署自訂程式碼前,建議先探索資料集,並濾除低品質的雜訊。在這個步驟中,您將分析 StackOverflow 問題,找出活躍使用者,並瞭解問題分數的統計分布。
為什麼要使用 Python UDF 執行這項作業?
在純 SQL 中,計算資料群組陣列的多個確切百分位數 (例如第 25、50、75 和 95 個百分位數) 相當複雜,且會耗用大量資源。標準 SQL 分析函式 (例如 PERCENTILE_CONT) 預期會收到資料列的平面欄,而非巢狀陣列。如要計算每個資料列預先匯總陣列的確切百分位數,您必須編寫詳細的子查詢,針對每個百分位數指標取消巢狀結構、排序及重新匯總,效率不彰。
在 UDF 中使用 Python 的高度最佳化科學程式庫 NumPy,您只需一行程式碼,就能計算數字陣列的精確數學百分位數。
執行作業
Google Cloud 託管了多個預先編譯的公開 UDF (按一下「Routines」分頁標籤)。由於 BigQuery 需要明確的型別比對,我們會使用通用資料表運算式 (CTE) 預先匯總資料,並使用 UNNEST 運算式將整數陣列轉換為浮點陣列。
在 BigQuery Studio 控制台中執行下列查詢:
WITH raw_user_scores AS (
-- 1. Pre-aggregate user scores into an array
SELECT
owner_user_id,
ARRAY_AGG(score) AS scores
FROM
`bigquery-public-data.stackoverflow.posts_questions`
WHERE
owner_user_id IS NOT NULL
GROUP BY
owner_user_id
HAVING
ARRAY_LENGTH(scores) >= 5
LIMIT 5
)
SELECT
owner_user_id,
scores,
-- 2. Cast arrays to FLOAT64 and call the public percentile Python UDF
`bigquery-public-data.python_udfs.percentiles`(
ARRAY(SELECT CAST(s AS FLOAT64) FROM UNNEST(scores) AS s),
[25.0, 50.0, 75.0, 95.0]
) AS score_percentiles
FROM
raw_user_scores;
這樣一來,您不必先設定權限或編寫自訂 Python 程式碼,就能立即瞭解使用者成效。
驗證結果
由於這項查詢會傳回巢狀陣列型別 (scores 和 score_percentiles),BigQuery Studio 中預設的表格「結果」分頁可能會顯示扁平化或截斷的輸出內容,導致難以檢查陣列元素。
如要查看結構化巢狀輸出內容,請按照下列步驟操作:
- 在查詢結果窗格中,找出分頁列 (預設為「結果」)。
- 按一下「JSON」分頁標籤。
您應該會看到代表資料列的結構化 JSON 陣列,類似於下列內容:
[{
"owner_user_id": "533463",
"scores": ["0", "0", "-1", "0", "0", "2", "-1", "1", "0", "0", "-1", "0", "-3", "1", "1", "0", "1", "2", "3", "1", "0", "0", "1", "0", "0", "3", "6", "11", "0", "1", "0", "0", "3", "17", "0", "1", "1", "3", "5", "-2", "1", "-1", "-1", "2", "3", "0", "0", "0", "5", "0", "4", "0", "0", "0", "3", "3", "0", "140", "0", "1", "3", "0", "0", "-2", "-1", "0", "0", "2", "0", "9", "9", "0", "0", "1", "0", "0", "1", "-1", "0", "0", "0", "0"],
"score_percentiles": ["0.0", "0.0", "1.75", "8.8500000000000085"]
}, {
"owner_user_id": "13502536",
"scores": ["0", "1", "0", "-5", "0", "1", "0", "1", "0", "0", "-2", "0", "1", "0", "1", "0", "0", "1", "0", "1", "0", "0"],
"score_percentiles": ["0.0", "0.0", "1.0", "1.0"]
}, {
"owner_user_id": "1170153",
"scores": ["1", "0", "1", "0", "1", "0", "2", "0", "0", "0", "10", "5", "1", "0", "0", "2", "0", "2", "3", "-1", "1", "0", "1", "0", "0", "1", "0", "2", "0", "4", "0", "3", "0", "0", "2", "0", "0", "1", "0"],
"score_percentiles": ["0.0", "0.0", "1.5", "4.1000000000000014"]
}, {
"owner_user_id": "8558174",
"scores": ["0", "0", "-1", "1", "2", "0"],
"score_percentiles": ["0.0", "0.0", "0.75", "1.75"]
}, {
"owner_user_id": "1073044",
"scores": ["0", "1", "0", "0", "2", "2", "2", "1", "1", "1", "2", "1", "0", "2", "3", "1"],
"score_percentiles": ["0.75", "1.0", "2.0", "2.25"]
}]
瞭解輸出內容
scores:每位不重複使用者發布的原始問題分數完整陣列。score_percentiles:包含四個計算出的浮點值。這些值與要求的百分位數完全一致:[25th, 50th, 75th, and 95th]百分位數。舉例來說,使用者533463的問題第 95 個百分位數分數約為8.85,表示他們的問題分數很高。
4. 透過建立自訂 UDF 原生清除文字
找出目標使用者後,我們就要分析他們的貼文內容。不過,原始論壇貼文通常含有雜亂的 HTML 標記和實體。我們需要移除這些內容,以提升可讀性並降低下游模型成本。
如要瞭解為何需要這麼做,請先檢查原始、未格式化的 Stack Overflow 貼文內文。在 BigQuery Studio 控制台中執行下列查詢:
SELECT
id,
title,
body AS raw_html_body
FROM
`bigquery-public-data.stackoverflow.posts_questions`
-- Check specific questions that we will use in our final pipeline
WHERE
id IN (9, 17, 33969)
ORDER BY
id ASC;
檢查輸出內容時,您會看到文字中嵌入了 <p>、<b>、<code> 等格式化標記。如果使用下游機器學習權杖化工具直接處理這些內容,會產生不必要的雜訊,並人為提高權杖擷取成本。
為什麼要使用 Python UDF 執行這項作業?
在純 SQL 中使用規則運算式 (Regex) 可靠地剖析 HTML 內容,容易發生剖析錯誤,而且不穩定。直接在查詢中執行 beautifulsoup4 等強大的 Python 程式庫,即可可靠地移除標記。
執行下列 DDL 查詢,在資料集中部署永久性 clean_html 函式:
CREATE OR REPLACE FUNCTION `YOUR_PROJECT_ID.python_udfs.clean_html`(html_content STRING)
RETURNS STRING
LANGUAGE python
OPTIONS (
runtime_version = 'python-3.11',
entry_point = 'strip_tags',
packages = ['beautifulsoup4>=4.12.0']
) AS r'''
from bs4 import BeautifulSoup
def strip_tags(html_content):
if not html_content:
return ""
soup = BeautifulSoup(html_content, "html.parser")
return soup.get_text(separator=" ")
''';
使用簡單的查詢驗證函式的輸出內容:
SELECT `YOUR_PROJECT_ID.python_udfs.clean_html`('<p>Hello <b>world</b>!</p>') AS cleaned_text;
您應該會看到不含 HTML 元素的文字:
+----------------+
| cleaned_text |
+----------------+
| Hello world ! |
+----------------+
5. 安全地整合外部服務及進階機器學習處理
現在我們有了乾淨的文字,需要為機器學習模型或大型語言模型 (LLM) (例如 Gemma) 準備文字。大型語言模型無法直接讀取原始文字,而是處理數字型權杖 ID。
如要將乾淨的文字轉換為符記,請匯入 Hugging Face 的 transformers 程式庫,並直接在資料庫中載入預先訓練的 Google T5 符記化工具。
建立 Cloud 資源連結
在 BigQuery Studio 控制台中執行下列查詢,建立安全連線:
CREATE CONNECTION IF NOT EXISTS `YOUR_PROJECT_ID.us.external_api_connection`
OPTIONS (
connection_type = "CLOUD_RESOURCE",
friendly_name = "Hugging Face Hub Egress Connection",
description = "Connection used to securely download model configs from public ML hubs"
);
建立 Tokenizer UDF
現在,請部署自訂權杖化工具 UDF。請注意,get_tokenizer() 輔助函式會先檢查全域變數 tokenizer 是否已初始化,再嘗試下載:
CREATE OR REPLACE FUNCTION `YOUR_PROJECT_ID.python_udfs.tokenize`(text STRING)
RETURNS ARRAY<INT64>
LANGUAGE python
WITH CONNECTION `YOUR_PROJECT_ID.us.external_api_connection`
OPTIONS (
runtime_version = 'python-3.11',
entry_point = 'tokenize',
packages = ['transformers', 'sentencepiece']
) AS r'''
from transformers import T5TokenizerFast
# Initialize global variable for in-memory container caching
tokenizer = None
def get_tokenizer():
global tokenizer
if tokenizer is None:
# Securely download T5 tokenizer config from Hugging Face Hub (runs once per warm container)
tokenizer = T5TokenizerFast.from_pretrained("t5-base")
return tokenizer
def tokenize(text):
if not text:
return []
try:
t = get_tokenizer()
# Convert raw clean text into integer token IDs
return [int(x) for x in t.encode(text)]
except Exception:
return []
''';
使用簡單的查詢測試權杖化工具,確認工具已成功下載資產並傳回整數 ID 陣列:
SELECT `YOUR_PROJECT_ID.python_udfs.tokenize`('Hello world!') AS token_ids;
切換至查詢結果面板中的「JSON」分頁,即可查看結構化陣列:
[
{
"token_ids": ["8774", "296", "55", "1"]
}
]
6. 執行端對端預先處理管道
現在管道的所有三個步驟都已準備就緒,我們可以透過一般資料表運算式 (CTE),將這些步驟串連成單一 SQL 查詢。
這個管道代表現代資料工程工作流程:
- 使用公開的百分位數 UDF,找出活躍使用者和他們得分最高的問題。
- 使用 clean_html UDF 從文字中移除原始 HTML 格式。
- 使用快取 tokenize UDF,將清除後的文字轉換為權杖陣列。
在 BigQuery Studio 控制台中執行下列管道查詢:
WITH raw_user_scores AS (
-- Step 1: Pre-aggregate scores to safely run percentiles with deterministic ordering
SELECT
owner_user_id,
ARRAY_AGG(score ORDER BY id ASC) AS scores
FROM
`bigquery-public-data.stackoverflow.posts_questions`
WHERE
owner_user_id IS NOT NULL
GROUP BY
owner_user_id
HAVING
ARRAY_LENGTH(scores) >= 5
ORDER BY
owner_user_id ASC
LIMIT 3
),
active_users AS (
-- Step 1: Extract exact percentile limits using the public UDF)
SELECT
owner_user_id,
percentiles_arr AS score_percentiles,
-- Extract the 95th percentile score from the array's 4th element (OFFSET 3) directly
percentiles_arr[OFFSET(3)] AS p95_score
FROM (
SELECT
owner_user_id,
`bigquery-public-data.python_udfs.percentiles`(
ARRAY(SELECT CAST(s AS FLOAT64) FROM UNNEST(scores) AS s),
[25.0, 50.0, 75.0, 95.0]
) AS percentiles_arr
FROM
raw_user_scores
)
),
target_questions AS (
-- Isolate high-scoring questions from active users
SELECT
q.id,
q.owner_user_id,
q.title,
q.body AS raw_body,
u.score_percentiles
FROM
`bigquery-public-data.stackoverflow.posts_questions` q
JOIN
active_users u ON q.owner_user_id = u.owner_user_id
WHERE
-- Explicit cast for robust comparison
q.score >= CAST(u.p95_score AS FLOAT64)
),
cleaned_data AS (
-- Step 2: Clean HTML tags natively
SELECT
id,
owner_user_id,
title,
score_percentiles,
`YOUR_PROJECT_ID.python_udfs.clean_html`(raw_body) AS cleaned_body
FROM
target_questions
),
tokenized_data AS (
-- Step 3: Perform local ML tokenization on the clean preview text
SELECT
id,
owner_user_id,
title,
score_percentiles,
SUBSTR(cleaned_body, 1, 120) AS cleaned_body_preview,
`YOUR_PROJECT_ID.python_udfs.tokenize`(SUBSTR(cleaned_body, 1, 120)) AS token_ids
FROM
cleaned_data
)
SELECT
id,
owner_user_id,
title,
score_percentiles,
cleaned_body_preview AS cleaned_body,
token_ids,
ARRAY_LENGTH(token_ids) AS token_count
FROM
tokenized_data
ORDER BY
id ASC;
切換至 BigQuery Studio 的「JSON」分頁,檢查結構化輸出內容。
[{
"id": "9",
"owner_user_id": "1",
"title": "How do I calculate someone\u0027s age based on a DateTime type birthday?",
"score_percentiles": ["22.5", "61.5", "346.75", "1762.0"],
"cleaned_body": "Given a DateTime representing a person\u0027s birthday, how do I calculate their age in years?",
"token_ids": ["9246", "3", "9", "7678", "13368", "9085", "3", "9", "568", "31", "7", "3591", "6", "149", "103", "27", "11837", "70", "1246", "16", "203", "58", "1"],
"token_count": "23"
}, {
"id": "17",
"owner_user_id": "2",
"title": "Binary Data in MySQL",
"score_percentiles": ["3.5", "10.0", "90.0", "184.09999999999997"],
"cleaned_body": "How do I store binary data in MySQL ?",
"token_ids": ["571", "103", "27", "1078", "14865", "331", "16", "27563", "3", "58", "1"],
"token_count": "11"
}, {
"id": "33969",
"owner_user_id": "3",
"title": "Best way to implement request throttling in ASP.NET MVC?",
"score_percentiles": ["3.25", "14.0", "24.75", "175.25"],
"cleaned_body": "We\u0027re experimenting with various ways to throttle user actions in a given time period : Limit question/answer posts Limi",
"token_ids": ["101", "31", "60", "3", "26718", "28", "796", "1155", "12", "28731", "1139", "2874", "16", "3", "9", "787", "97", "1059", "3", "10", "18185", "822", "87", "3247", "3321", "3489", "10908", "23", "1"],
"token_count": "29"
}]
7. 附錄:管道運作方式和稽核執行成本
本節將深入探索端對端前置處理查詢的具體機制,並示範如何監控執行作業的確切運算單元消耗量和受管理容器費用。
管道架構細目
WITH raw_user_scores AS (
SELECT
owner_user_id,
ARRAY_AGG(score ORDER BY id ASC) AS scores
FROM
`bigquery-public-data.stackoverflow.posts_questions`
WHERE
owner_user_id IS NOT NULL
GROUP BY
owner_user_id
HAVING
ARRAY_LENGTH(scores) >= 5
ORDER BY
owner_user_id ASC
LIMIT 3
)
第一個查詢區段會收集活躍 Stack Overflow 貢獻者的原始問題分數。這項作業會將每位使用者的分數整合成單一陣列 (ARRAY_AGG),同時強制執行確定性排序順序 (ORDER BY id)。資料集經過篩選後,只會納入至少回答五個問題的使用者,以建立有效的統計基準。
active_users AS (
SELECT
owner_user_id,
percentiles_arr AS score_percentiles,
-- Extract the 95th percentile score from the array's 4th element (OFFSET 3) directly
percentiles_arr[OFFSET(3)] AS p95_score
FROM (
SELECT
owner_user_id,
`bigquery-public-data.python_udfs.percentiles`(
ARRAY(SELECT CAST(s AS FLOAT64) FROM UNNEST(scores) AS s),
[25.0, 50.0, 75.0, 95.0]
) AS percentiles_arr
FROM
raw_user_scores
)
)
為找出頂尖貢獻者,這個區隔會使用公開的 percentiles Python UDF,找出確切的分數分布 (第 25、50、75 和 95 百分位數)。為避免多次執行這項需要大量運算的 UDF,計算作業會包裝在巢狀子查詢中。然後直接從索引位置三 (OFFSET(3)) 的結果陣列中擷取第 95 個百分位數基準。
target_questions AS (
-- Isolate high-scoring questions from active users
SELECT
q.id,
q.owner_user_id,
q.title,
q.body AS raw_body,
u.score_percentiles
FROM
`bigquery-public-data.stackoverflow.posts_questions` q
JOIN
active_users u ON q.owner_user_id = u.owner_user_id
WHERE
-- Explicit cast for robust comparison
q.score >= CAST(u.p95_score AS FLOAT64)
)
原始問題會與活躍使用者清單合併,以擷取達到或超過第 95 百分位數門檻的貼文。為避免資料庫類型比較錯誤,基準分數會在評估前透過 CAST 運算作業明確轉換為 FLOAT64 類型。
cleaned_data AS (
-- Clean HTML tags natively
SELECT
id,
owner_user_id,
title,
score_percentiles,
`YOUR_PROJECT_ID.python_udfs.clean_html`(raw_body) AS cleaned_body
FROM
target_questions
)
原始文章內文通常含有雜亂的標記和 HTML 樣板,會降低下游機器學習的輸入內容品質。管道會呼叫自訂 clean_html Python UDF,而不是使用複雜的規則運算式。這項功能會在獨立容器中動態啟動 Python 執行階段,使用 BeautifulSoup 程式庫清除元素,並輸出可讀的純文字。
tokenized_data AS (
-- Perform local ML tokenization on the clean preview text (called only once)
SELECT
id,
owner_user_id,
title,
score_percentiles,
SUBSTR(cleaned_body, 1, 120) AS cleaned_body_preview,
`YOUR_PROJECT_ID.python_udfs.tokenize`(SUBSTR(cleaned_body, 1, 120)) AS token_ids
FROM
cleaned_data
)
為準備生成模型擷取的乾淨文字預覽,管道會在 120 個字元的切片上叫用自訂 tokenize Python UDF。UDF 會安全地連線至 Hugging Face Hub,下載 Google T5 權杖化工具參數。由於權杖化工具執行個體會載入全域變數,因此暖容器會快取設定,讓後續資料列在記憶體內快速權杖化,不會發生網路延遲。
SELECT
id,
owner_user_id,
title,
score_percentiles,
cleaned_body_preview AS cleaned_body,
token_ids,
ARRAY_LENGTH(token_ids) AS token_count
FROM
tokenized_data
ORDER BY
id ASC;
最後一個查詢區塊會輸出處理後的資料集。與其再次執行權杖化 UDF 來計算產生的權杖,不如直接將 BigQuery 的原生 ARRAY_LENGTH 函式套用至預先計算的 token_ids 陣列。這項策略可減少多餘的 CPU 週期、容器作業和整體執行成本。
稽核 Slot 用量和受管理 UDF 的費用
BigQuery 會直接在 Google Cloud 控制台 UI 中推出完整的費用資訊主頁,但工程師可以使用 BigQuery 工作 ID,以程式輔助方式稽核任何查詢的確切運算單元消耗量和受管理容器執行作業費用。
如要稽核查詢執行作業,請找出工作 ID。
- 在 BigQuery Studio 中,前往控制台底部的「查詢記錄」分頁即可找到這項資訊
- 按一下已執行的管道查詢
- 在「Job Information」(工作資訊) 詳細資料面板中,找出「Job ID」(工作 ID) 欄位。
找出純工作 ID 後,請在下列查詢中取代 JOB_ID,並在 BigQuery Studio 中執行:
SELECT
job_id,
total_slot_ms,
external_service_costs
FROM
`YOUR_PROJECT_ID.region-us`.INFORMATION_SCHEMA.JOBS
WHERE
job_id = "JOB_ID";
切換至 BigQuery Studio 的「JSON」分頁,檢查結構化輸出內容。您應該會收到類似下列內容的酬載:
[{
"job_id": "bquxjob_1234f5a_67ea8c9051a",
"total_slot_ms": "815459",
"external_service_costs": [{
"external_service": "MANAGED_ROUTINE_EXECUTION",
"bytes_processed": null,
"bytes_billed": null,
"slot_ms": "3000",
"reserved_slot_count": null,
"billing_method": "SERVICES_SKU"
}]
}]
瞭解輸出內容:
total_slot_ms:所有查詢階段使用的總運算時間 (以毫秒為單位)。這個統一管道的執行時間通常平均約為 815, 000 個時段毫秒。external_service_costs:這個陣列會細分標準 BigQuery 分析引擎以外使用的資源。external_service:「MANAGED_ROUTINE_EXECUTION」值確認費用專屬於無伺服器容器執行作業,該作業代管自訂 Python UDF 環境。slot_ms:「3000」值代表在暖容器執行階段執行 Python 邏輯時,耗用的專用運算資源確切毫秒數。billing_method:值「SERVICES_SKU」表示這些本地化容器費用會透過專用的 BigQuery 服務 SKU 動態計費,計費依據為容器執行時間和記憶體負擔。以美國標準多區域運算價格每運算單元時數 $0.06 美元 (請參閱 BigQuery 服務定價頁面) 來說,3,000 運算單元毫秒的純執行成本計算方式為 (3,000 毫秒 / 3,600,000 毫秒) * $0.06 美元 = $0.00005 美元,顯示工作流程的成本效益。
8. 清理雲端資源
如要避免持續產生費用或耗用專案配額,請在 Cloud Shell 中刪除 BigQuery 資料集和連線:
# Cleanup BigQuery routines
bq rm -f --routine ${PROJECT_ID}:${BQ_DATASET}.clean_html
bq rm -f --routine ${PROJECT_ID}:${BQ_DATASET}.tokenize
# Cleanup connection
bq rm -f --connection --location=${REGION} ${PROJECT_ID}.${REGION}.${BQ_RESOURCE_CONN}
# Cleanup BigQuery Dataset
bq rm -r -f -d ${PROJECT_ID}:${BQ_DATASET}
9. 恭喜!
您已完成本程式碼實驗室,瞭解如何在 BigQuery 無伺服器執行階段中建構及保護 Python UDF。
在本程式碼研究室中,您已瞭解如何:
- 使用公開 UDF 探索資料:在 Stack Overflow 資料集上呼叫預先編譯的公開 Python UDF,對匯總陣列執行數學百分位數運算。
- 整合第三方套件:運用標準 Python 執行階段和
beautifulsoup4程式庫部署自訂持續性 UDF,在 SQL 查詢中原生剝除原始 HTML 標記。 - 設定安全外部連線:建立 BigQuery Cloud 資源連線,安全地授予隔離 UDF 容器傳出網路存取權,以便擷取外部資產,不必將憑證硬式編碼。
- 使用記憶體內快取實作本機權杖化:匯入 Hugging Face
transformers程式庫來載入 T5 權杖化工具,並利用全域變數快取設定檔,以及處理暖容器內的資料列。 - 稽核執行效能和費用:使用 BigQuery 作業 ID,以程式輔助方式查詢區域 INFORMATION_SCHEMA.JOBS 檢視區塊,追蹤運算單元耗用量 (
total_slot_ms) 和容器用量費用 (external_service_costs)。
後續步驟
- 查看最佳做法和配額:請參閱 BigQuery Python UDF 限制指南,瞭解執行限制、並行和記憶體考量事項。
- 深入瞭解成本最佳化:請參閱 BigQuery 定價說明文件,瞭解容器化 UDF 環境和外部連線呼叫的計費方式。
- 在 BigQuery 中建構 AI 輔助應用程式:除了基本的文字操作,您還可以瞭解如何建構端對端多模態系統。完成使用 BigQuery 和 Gemini 模型建構 AI 輔助車輛市集程式碼研究室,直接在資料倉儲中運用語意搜尋和 Gemini 模型。