BigQuery:无服务器、高性能数据仓库
BigQuery 完全入门指南:无服务器、高性能数据仓库
什么是 BigQuery
BigQuery 是 Google Cloud 提供的全托管、无服务器、高度可扩展且成本效益极高的多云数据仓库。它专为大规模数据集(TB 到 PB 级)的极速分析而设计,让您无需管理基础设施即可使用标准 SQL 查询数据。作为数据仓库,它将存储与计算分离,支持实时分析、内置机器学习以及与 BI 工具的深度集成。
为什么选择 BigQuery
- 真正的无服务器:无需预配、管理或扩展集群,Google 全权负责底层资源。
- 极致性能:列式存储、树状架构和 Dremel 查询引擎,数十亿行数据秒级响应。
- 成本透明可控:存储和查询分开计费,提供按需定价与预留槽位两种模型,并有严格的成本控制机制。
- 内置高级功能:BigQuery ML 支持在 SQL 中直接构建机器学习模型;地理空间分析、BI Engine 加速、联邦查询等功能开箱即用。
- 安全与合规:自动加密、细粒度权限、动态数据脱敏,符合 SOC、HIPAA 等主要行业标准。
BigQuery 架构与核心概念
理解 BigQuery 的架构是高效使用它的前提。其核心设计将计算与存储分离,两者通过高速网络进行通信。
存储层:列式存储与自动优化
数据以列式格式(Capacitor 列式文件)存储,仅读取查询所需的列,极大减少 I/O。数据自动压缩、加密,并支持多区域冗余。您无需关心索引、分区键以外的物理优化,BigQuery 在后台自动重组数据以提高性能。
- 数据集(Dataset):最高层容器,用于组织和控制数据访问。
- 表(Table):数据存储的基本单元,包含行和列。支持原生表、外部表、视图。
- 分区(Partition):将大表拆分为更小的段,通常按时间单位(日、小时等)或整数范围划分,有效降低查询扫描量和成本。
- 聚簇(Cluster):在分区内按指定列排序数据,能将类似值聚集在一起,进一步加速过滤查询。
计算层:Dremel 查询引擎与槽位
BigQuery 的计算能力以“槽位(Slot)”为单位。一个槽代表执行 SQL 查询所需的一定数量计算资源(CPU、内存)。无服务器意味着您不用直接调配槽位数,而是选择两种计费方式:
- 按需(On‑demand):按查询扫描的字节数付费,适合不确定工作负载的场景。
- 预留槽位(Slot Reservation):购买固定计算容量,适合稳定、可预测的查询需求,成本更可控,并支持自动扩缩容。
Dremel 是底层执行引擎,它将 SQL 查询转换为执行树,在大量节点上并行处理,并将结果快速聚合。
元数据与资源管理
BigQuery 使用项目和数据集两级组织资源。权限通过 Identity and Access Management(IAM)管理,可精细控制到数据集、表甚至列级别。所有操作通过 REST API、gcloud CLI、多种语言 SDK 或 Cloud Console 完成。
快速入门:您的第一个查询
我们将通过一个免费可用的公共数据集体验 BigQuery。
步骤 1:访问 BigQuery
- 访问 Google Cloud 控制台,创建或选择项目。
- 左侧导航菜单进入 BigQuery。
- 如果没有启用,按提示启用 BigQuery API(首次通常免费,无需绑定结算账号也可使用沙盒模式)。
沙盒模式:无需信用卡即可试用 BigQuery,每月有 1TB 免费查询额度和 10GB 免费存储额度。
步骤 2:探索公共数据集
- 在 BigQuery 控制台点击 + 添加,选择 公共数据集。
- 搜索
bigquery-public-data并查看,找到hacker_news数据集。 - 展开
hacker_news>stories表。此表包含 Hacker News 的所有故事信息。
步骤 3:运行第一个 SQL 查询
点击 查询 标签页,输入以下 SQL:
SELECT
title,
score,
time_ts
FROM
`bigquery-public-data.hacker_news.stories`
WHERE
score > 1000
ORDER BY
score DESC
LIMIT 10
点击 执行。查询将在数秒内扫描几十万行并返回热门故事。观察右下方显示的扫描字节数和执行时间,感受 BigQuery 的速度。
步骤 4:创建自己的数据集和表
- 点击项目旁边的 操作 > 创建数据集,填写数据集 ID(例如
my_first_dataset),数据位置选择首选的区域。 - 在数据集中点击 创建表。选择 上传 作为源,上传一个 CSV 文件,架构可自动检测。
- 创建完成后,用
SELECT * FROM查询您的表。
数据加载与集成
BigQuery 提供多种加载数据的方式,满足批处理和流式场景。
批量加载
- 从 Cloud Storage 加载:支持 CSV、JSON、Avro、Parquet、ORC 等格式。加载是免费的,且支持压缩文件。
- 本地文件直接上传:通过控制台或 CLI 上传较小文件(最大 10MB/个)。控制台支持在创建表时直接上传。
- 其他 Google 服务:可使用 Dataflow、Dataproc 将数据写入 BigQuery,或通过 Cloud Functions 响应事件自动加载。
- 联邦查询(Federated Query):无需加载,可直接查询 Cloud Storage、Cloud SQL、Bigtable、Spanner 甚至 AWS S3 中的外部数据源。使用
EXTERNAL_QUERY或直接定义外部表。
流式插入(Streaming Ingestion)
通过 BigQuery Storage Write API 可以低延迟(秒级)将数据实时写入表。与旧版流 API 相比,它提供了恰好一次语义和更高的吞吐量。
- 适用于 IoT 遥测、日志、事件驱动场景。
- 数据先进入缓冲区,短时间内即可查询。可通过
_PARTITIONTIME或摄取时间戳进行过滤。
BigQuery 数据传输服务(Data Transfer Service)
自动将多个外部数据源的数据调度加载到 BigQuery,无需编写代码。
- 支持数百种连接器:Google Ads、YouTube、Campaign Manager、Google Play 以及第三方 SaaS(通过 Partner Connectors)。
- 支持 Amazon S3、Redshift 的迁移。
- 设置定期自动刷新计划。
查询性能优化与最佳实践
BigQuery 开箱即用性能优异,但遵循最佳实践可进一步降低成本并加速查询。
减少查询扫描量
- SELECT 仅所需列:避免
SELECT *,尤其大宽表。 - 使用分区过滤:尽量在 WHERE 子句中对分区列使用条件,如
WHERE _PARTITIONTIME >= '2025-01-01'。 - 利用聚簇:将常用于过滤和聚合的列设置为聚簇键(最多 4 列),聚类字段应与查询中的过滤顺序匹配。
- 合理的表设计:考虑时间分区、整数范围分区,避免单表过度增长。
查询编写技巧
- 先过滤后聚合:在子查询或 CTE 中尽早过滤,减少参与聚合的数据。
- 使用近似聚合函数:对于不需要精确计数的场景,使用
APPROX_COUNT_DISTINCT替代COUNT(DISTINCT),大幅提升性能。 - 避免过多 JOIN:重新设计架构或预计算实体化视图来减少复杂 JOIN。
- 使用临时表或 CTE 拆解复杂查询,提高可读性和优化空间。
利用物化视图
物化视图(Materialized View)可预计算和缓存查询结果,自动增量刷新。对重复执行的聚合查询,性能提升极显著。
- 创建:
CREATE MATERIALIZED VIEW ... AS SELECT ... - 优化器可在基础表直接查询的 SQL 中自动重写,转向物化视图。
BI Engine
BI Engine 是一种内存分析加速器,可与 BigQuery 无缝集成。为常访问的数据提供亚秒级查询响应并减少延迟,尤其适合 Data Studio、Looker 等仪表板场景。可以在表或数据集级别预留内存容量。
BigQuery ML:在 SQL 中做机器学习
无需将数据移出 BigQuery,无需 Python,直接用 SQL 构建和部署机器学习模型。
支持的模型类型
- 线性回归、逻辑回归(分类)
- 时间序列预测(ARIMA 等)
- 聚类(K-means)
- 矩阵分解(推荐系统)
- 深度学习(基于 TensorFlow 的 DNN/CNN,仅需 SQL 指定)
- AutoML Tables(自动特征工程和模型调优)
- 导入 TensorFlow、XGBoost 模型直接预测
快速示例:用户购买预测
-- 1. 创建逻辑回归模型
CREATE OR REPLACE MODEL my_dataset.purchase_model
OPTIONS(model_type='logistic_reg', input_label_cols=['purchased']) AS
SELECT
IF(purchase_date IS NOT NULL, 1, 0) AS purchased,
page_views,
time_on_site,
device_category
FROM my_dataset.user_sessions;
-- 2. 评估模型
SELECT * FROM ML.EVALUATE(MODEL my_dataset.purchase_model);
-- 3. 对新数据进行预测
SELECT
user_id,
predicted_purchased,
predicted_purchased_probs
FROM ML.PREDICT(MODEL my_dataset.purchase_model,
(SELECT * FROM my_dataset.new_sessions));
BigQuery ML 简化了从数据到模型的流程,适合快速原型和 SQL 背景的分析人员。
成本管理与监控
您不需要为“闲置”支付计算费用,但需要理解计费模式并设置防护。
计费组成
- 存储成本:活跃存储(过去 90 天有修改)和长期存储(连续 90 天未修改,价格自动下降约 50%)。按压缩后的数据量计费,价格极低。
- 查询成本:
- 按需:每 TB 扫描 $5.00(价格因区域可能有差异),每月前 1TB 免费。
- 预留槽位:购买计算容量承诺,容量单位是槽。
成本控制方法
- 自定义配额:在项目或用户级别设置每日查询字节数上限,防止意外高额账单。
- 查询计划与预估:执行前使用
--dry_run或在控制台观察预估扫描字节数。 - 分区表:强制使用分区过滤,避免全表扫描。
- 设置账单提醒:Cloud Billing 中创建预算和警报。
使用 INFORMATION_SCHEMA 分析成本
BigQuery 的 INFORMATION_SCHEMA 视图可帮助您分析作业、表和查询成本:
-- 查看最近7天最消耗的查询
SELECT
query,
total_bytes_processed,
total_slot_ms,
creation_time
FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY total_bytes_processed DESC
LIMIT 10;
访问控制与安全
- IAM 角色:预定义角色
roles/bigquery.dataViewer、dataEditor、dataOwner、jobUser。最小权限原则。 - 授权视图:允许用户查询视图而不直接访问底层表,可混淆敏感列。
- 列级安全:通过策略标签实现动态数据脱敏,基于用户角色过滤明文、哈希或遮蔽。
- VPC Service Controls:创建安全边界,防止数据被未授权网络导出。
- CMEK:使用自己管理的加密密钥。
与其他工具集成
- 数据可视化:原生支持 Looker Studio(原 Data Studio),也可连接 Tableau、Power BI、Looker 等主流 BI 工具。
- 数据处理:可使用 Cloud Dataflow、Dataproc、Cloud Composer 编排 ETL 流水线。
- 地理空间分析:使用 BigQuery GIS 扩展,支持 GEOGRAPHY 数据类型和多种 ST_ 函数。
- 编程语言 SDK:提供 Python、Java、Node.js、Go 等客户端库。
进阶主题概览
- BigQuery Omni:跨多云查询,可在 AWS 和 Azure 数据上运行 BigQuery 分析。
- 存储过程和多语句事务:支持脚本、变量、异常处理,及多语句事务保证一致性。
- 容灾与高可用:多区域存储提供零操作自动故障转移,保证 99.99% 可用性 SLA。
- BigLake:统一数据湖仓,通过 BigQuery 统一查询数据湖中的数据,支持细粒度访问控制。
总结
BigQuery 重新定义了现代数据仓库的体验——它消除了基础设施管理的负担,让所有技能水平的人员都能以 SQL 为基础,极速分析海量数据。从一次性探索到企业级生产环境,BigQuery 借助其无服务器架构、深度整合的 ML 能力和灵活的计费模型,成为数据驱动决策的核心引擎。
现在,您可以在 BigQuery 沙盒中亲手尝试加载数据、编写查询,并探索其内置的公共数据集。当您准备好的时候,将项目升级到付费模式,解锁完整的 PB 级分析能力。