BigQuery 数据分析:无服务器数仓与 ML

FreeGuideOnline 最新 2026-06-17

BigQuery 数据分析完全指南:无服务器数仓与内置机器学习

BigQuery 是 Google Cloud 推出的全托管、无服务器数据仓库,能让你在几秒内分析 TB 甚至 PB 级数据,且无需管理任何基础设施。本教程面向初学者,从零开始带你掌握 BigQuery 数据分析与内置的 BigQuery ML 机器学习功能。

1. 理解 BigQuery 的无服务器数仓本质

传统数据仓库需要预先分配计算和存储资源,处理扩容、缩容、索引维护等繁重工作。BigQuery 将存储与计算完全分离,你只需为实际扫描的数据量和使用的计算资源付费,无需配置任何服务器。

  • 无服务器:没有节点、实例概念,系统自动处理分布式查询和资源调度。
  • 列式存储:数据按列压缩存储,分析查询只需读取相关列,极大降低 I/O 和成本。
  • 标准 SQL:兼容 ANSI SQL,多数分析人员可直接上手。
  • 内置机器学习:通过 SQL 语句即可训练和部署模型,无需导出数据或额外迁移。

2. 准备工作:访问 BigQuery 控制台

开始前,你需要一个 Google Cloud 项目并启用 BigQuery API(大多数项目默认启用)。直接访问 console.cloud.google.com/bigquery 即可进入 BigQuery 工作室。

2.1 认识 BigQuery 工作室界面

  • 资源管理器:左侧显示项目、数据集和表。你可以固定、搜索并查看表的 schema。
  • 查询编辑器:编写和执行 SQL 的地方。
  • 结果面板:展示查询结果、执行计划及作业历史。
  • 数据洞察:自动生成图表,快速探索数据分布。

3. 第一个查询:探索公共数据集

Google 提供了大量公共数据集,如 bigquery-public-data。以下示例查询纽约市出租车行程记录。

SELECT
  pickup_datetime,
  trip_distance,
  fare_amount,
  tip_amount
FROM
  `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
WHERE
  pickup_datetime BETWEEN '2015-01-01' AND '2015-01-07'
LIMIT 10;

点击“运行”,BigQuery 会自动分配计算资源,几秒内返回结果。界面顶部会显示扫描的数据量,帮助你预估成本。

3.1 关键概念:数据集、表、视图

  • 数据集:容纳表、视图、机器学习模型的容器,通常对应一个业务领域或环境(开发 / 生产)。
  • :数据物理存储的单位。BigQuery 支持原生表(从文件或流加载)、外部表(查询 Cloud Storage 或 Bigtable 的数据)等。
  • 视图:保存的 SQL 查询,不存储数据,每次查询实时计算。

4. 数据分析核心 SQL 技术

BigQuery 支持完整的标准 SQL 语法,并扩展了实用函数。掌握以下要点即可应对大多数分析场景。

4.1 聚合与分组

计算每日行程总量和平均费用:

SELECT
  DATE(pickup_datetime) AS trip_date,
  COUNT(*) AS total_trips,
  AVG(fare_amount) AS avg_fare,
  SUM(tip_amount) / SUM(fare_amount) * 100 AS tip_percentage
FROM
  `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
WHERE
  pickup_datetime BETWEEN '2015-01-01' AND '2015-01-31'
GROUP BY
  trip_date
ORDER BY
  trip_date;

4.2 窗口函数

窗口函数让你在不折叠行的前提下进行排名、滚动聚合等操作。例如,找出每天消费最高的一笔行程:

SELECT
  pickup_datetime,
  trip_distance,
  fare_amount,
  ROW_NUMBER() OVER(PARTITION BY DATE(pickup_datetime) ORDER BY fare_amount DESC) AS rank
FROM
  `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
WHERE
  DATE(pickup_datetime) BETWEEN '2015-01-01' AND '2015-01-05';

常用窗口函数:RANK()LAG()SUM(...) OVER(ORDER BY ... ROWS BETWEEN ...)

4.3 处理嵌套与重复数据

BigQuery 原生支持 STRUCTARRAY 列,适合存储 JSON 或事件日志。使用 UNNEST 展开数组:

SELECT
  visitor_id,
  hit.product.v2ProductName AS product_name
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
  UNNEST(hits) AS hit
WHERE
  _TABLE_SUFFIX = '20170701'
LIMIT 100;

4.4 时间分区与聚类

为优化性能和成本,通常在创建表时指定分区列(如日期)和聚簇列(如用户 ID)。示例建表语句:

CREATE OR REPLACE TABLE my_dataset.trips_partitioned
PARTITION BY DATE(pickup_datetime)
CLUSTER BY vendor_id
AS
SELECT * FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`;

对分区表查询时,添加过滤条件可以只扫描必要分区,大幅降低成本。

5. BigQuery ML:用 SQL 进行机器学习

BigQuery ML(BQML)让分析师在现有数据仓库内直接构建、评估和部署机器学习模型,无需将数据导出到 Python 环境或管理模型服务器。

5.1 支持的模型类型

  • 线性回归 / 逻辑回归(LINEAR_REG, LOGISTIC_REG
  • 增强型时间序列(ARIMA_PLUS
  • K-Means 聚类(KMEANS
  • 矩阵分解(MATRIX_FACTORIZATION 推荐系统)
  • 深度神经网络(DNN_CLASSIFIERDNN_REGRESSOR
  • AutoML Tables(AUTOML_CLASSIFIERAUTOML_REGRESSOR
  • 预训练模型(如 TENSORFLOW 导入),及远程模型(调用 Vertex AI)

5.2 训练第一个模型:预测出租车小费金额

我们将使用同一出租车数据集,学习如何根据行程特征预测小费(线性回归)。

步骤 1:创建模型

CREATE OR REPLACE MODEL `my_dataset.tip_prediction_model`
OPTIONS(model_type='linear_reg', input_label_cols=['tip_amount']) AS
SELECT
  trip_distance,
  fare_amount,
  passenger_count,
  EXTRACT(HOUR FROM pickup_datetime) AS pickup_hour,
  ABS(MOD(FARM_FINGERPRINT(CAST(pickup_datetime AS STRING)), 4)) = 0 AS is_training_split
FROM
  `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
WHERE
  pickup_datetime BETWEEN '2015-01-01' AND '2015-06-30';

这里用 FARM_FINGERPRINT 将数据随机分为训练集(标记为 TRUE)和评估集。BQML 默认将 80% 用于训练,剩余用于评估。

步骤 2:查看训练结果

训练完成后,运行:

SELECT * FROM ML.EVALUATE(MODEL `my_dataset.tip_prediction_model`);

输出包括平均绝对误差、均方误差等指标,帮助你判断模型质量。

步骤 3:查看特征权重

SELECT
  processed_input AS feature,
  weight
FROM
  ML.WEIGHTS(MODEL `my_dataset.tip_prediction_model`)
ORDER BY ABS(weight) DESC;

步骤 4:预测新数据

SELECT
  predicted_tip_amount,
  tip_amount AS actual_tip
FROM
  ML.PREDICT(MODEL `my_dataset.tip_prediction_model`,
    (SELECT *
     FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
     WHERE pickup_datetime = '2015-07-01 08:00:00'
     LIMIT 10)
  );

5.3 时间序列预测:预报每日行程量

BigQuery ML 的 ARIMA_PLUS 模型可以自动识别周期、节假日效应并进行预测。

-- 准备每日聚合视图
CREATE OR REPLACE VIEW `my_dataset.daily_trips` AS
SELECT
  DATE(pickup_datetime) AS trip_date,
  COUNT(*) AS num_trips
FROM
  `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
GROUP BY trip_date;

-- 训练时间序列模型
CREATE OR REPLACE MODEL `my_dataset.trips_forecast`
OPTIONS(
  model_type='ARIMA_PLUS',
  time_series_timestamp_col='trip_date',
  time_series_data_col='num_trips',
  auto_arima=TRUE,
  data_frequency='DAILY',
  holiday_region='US'
) AS
SELECT
  trip_date,
  num_trips
FROM
  `my_dataset.daily_trips`
WHERE trip_date < '2015-07-01';

-- 预测未来 30 天
SELECT *
FROM
  ML.FORECAST(MODEL `my_dataset.trips_forecast`,
              STRUCT(30 AS horizon, 0.9 AS confidence_level));

结果包含预测值、上限、下限等信息,可直接导出或用于 BI 工具。

5.4 使用 AutoML Tables 自动构建模型

如果你想尝试更高级的自动化特征工程和模型选择,可以使用 AUTOML_CLASSIFIERAUTOML_REGRESSOR。只需指定目标列,BigQuery 会自动搜索最佳模型。注意 AutoML 训练时间较长(数小时),费用也更高。

CREATE OR REPLACE MODEL `my_dataset.tip_automl`
OPTIONS(
  model_type='AUTOML_REGRESSOR',
  input_label_cols=['tip_amount'],
  budget_hours=1.0
) AS
SELECT
  *
FROM
  `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2015`
WHERE
  pickup_datetime BETWEEN '2015-01-01' AND '2015-03-31';

6. 最佳实践与成本控制

6.1 查询成本优化

  • 使用分区和聚簇:只要可能,就限制扫描分区。
  • 避免 SELECT *:仅选择需要的列,减少扫描量。
  • 预览数据:使用预览功能查看数据,不产生费用。
  • 保持查询简洁:需要重复查询的中间结果物化为表或物化视图。
  • 设置成本控制:在查询设置中限定最大计费字节数或使用自定义配额。

6.2 机器学习模型治理

  • 模型生命周期:定期重新训练或使用 ML.EVALUATE 监控性能衰减。
  • 模型版本管理:用带有时间戳的模型名称实现简单版本化。
  • 特征存储:结合 BigQuery 视图和表构建特征集,确保训练 / 服务时一致性。

6.3 协作与权限

BigQuery 资源(项目、数据集、表)遵循 IAM 权限,可以精细控制读 / 写 / 管理层级。常用角色:roles/bigquery.dataViewerroles/bigquery.dataEditorroles/bigquery.jobUser

7. 总结与下一步

通过本教程你已掌握:

  • BigQuery 无服务器架构的优势
  • 如何使用标准 SQL 进行探索性分析
  • 利用分区、窗口函数、嵌套数据处理复杂数据
  • 训练线性回归、时间序列等模型,并直接通过 SQL 预测

下一步建议:

  • 深入学习 BigQuery 官方文档
  • 尝试加载你自己的数据集(CSV、JSON 等),并构建端到端分析管道
  • 将 BigQuery 数据连接到 Google Data Studio(Looker Studio)或第三方 BI 工具,创建仪表盘
  • 探索 BigQuery ML 的高级功能,如特征工程转换函数(ML.FEATURE_CROSS)和模型导出

BigQuery 让数据分析与机器学习在同一个 SQL 环境中无缝融合,大幅降低了从数据到洞察的门槛。现在就去查询编辑器,亲手实践吧。