在 BigQuery 中轻松准备数据:面向低代码开发者的指南

1. 简介

数据分析师经常会遇到以 JSON 载荷等半结构化格式锁定的宝贵数据。提取和准备这些数据以进行分析和机器学习,在过去一直是一项重大的技术障碍,通常需要复杂的 ETL 脚本和数据工程团队的介入。

此 Codelab 为数据分析师提供了一份技术蓝图,帮助他们独立克服这一挑战。它展示了一种“低代码”方法,用于构建端到端 AI 流水线。您将学习如何仅使用 BigQuery Studio 中的工具,将 Google Cloud Storage 中的原始 CSV 文件转换为由 AI 驱动的推荐功能。

主要目标是展示一种稳健、快速且便于分析师使用的工作流程,该流程可摆脱复杂且需要大量代码的流程,从而利用数据创造真正的业务价值。

前提条件

  • 对 Google Cloud 控制台有基本的了解
  • 具备命令行界面和 Google Cloud Shell 方面的基本技能

学习内容

  • 如何使用 BigQuery Data Preparation 直接从 Google Cloud Storage 提取和转换 CSV 文件。
  • 如何使用无代码转换来解析和扁平化数据中的嵌套 JSON 字符串。
  • 如何创建连接到 Vertex AI 基础模型以进行文本嵌入的 BigQuery ML 远程模型。
  • 如何使用 ML.GENERATE_TEXT_EMBEDDING 函数将文本数据转换为数值向量。
  • 如何使用 ML.DISTANCE 函数计算余弦相似度并查找数据集中的最相似项。

所需条件

  • Google Cloud 账号和 Google Cloud 项目
  • 网络浏览器,例如 Chrome

主要概念

  • BigQuery 数据准备:BigQuery Studio 中的一种工具,可提供用于数据清理和准备的互动式可视化界面。它会建议转换,并允许用户使用最少的代码构建数据流水线。
  • BQML 远程模型:充当 Vertex AI(例如 Gemini)上托管的模型的代理的 BigQuery ML 对象。借助此功能,您可以使用熟悉的 SQL 语法调用强大的预训练 AI 模型。
  • 向量嵌入:数据的数值表示形式,例如文本或图片。在此 Codelab 中,我们将把艺术品的文字说明转换为向量,其中相似的说明会生成在多维空间中“更接近”的向量。
  • 余弦相似度:一种用于确定两个向量相似程度的数学度量。它是推荐引擎逻辑的核心,供 ML.DISTANCE 函数用于查找“最接近”(最相似)的艺术品。

2. 设置和要求

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:

55efc1aaa7a4d3ad.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。

启用所需的 API 并配置环境

在 Cloud Shell 中,运行以下命令以设置项目 ID、定义环境变量,并为此 Codelab 启用所有必需的 API。

export PROJECT_ID=$(gcloud config get-value project)
gcloud config set project $PROJECT_ID
export LOCATION="US"
export GCS_BUCKET_NAME="met-artworks-source-${PROJECT_ID}" # Must be a globally unique name

gcloud services enable bigquery.googleapis.com \
                       storage.googleapis.com \
                       aiplatform.googleapis.com \
                       bigqueryconnection.googleapis.com

创建 BigQuery 数据集和 GCS 存储分区

创建一个新的 BigQuery 数据集来存放我们的表,并创建一个 Google Cloud Storage 存储分区来存储我们的源 CSV 文件。

# Create the BigQuery Dataset in the US multi-region
bq --location=$LOCATION mk --dataset $PROJECT_ID:met_art_dataset

# Create the GCS Bucket
gcloud storage buckets create gs://$GCS_BUCKET_NAME --project=$PROJECT_ID --location=$LOCATION

准备并上传示例数据

克隆包含示例 CSV 文件的 GitHub 代码库,然后将其上传到您刚刚创建的 GCS 存储分区。

# Clone the repository
git clone https://github.com/GoogleCloudPlatform/devrel-demos.git

# Navigate to the correct directory
cd devrel-demos/data-analytics/dataprep

# Upload the CSV file to your GCS bucket
gsutil cp dataprep-met-bqml.csv gs://$GCS_BUCKET_NAME/

3. 使用数据准备功能将数据从 GCS 迁移到 BigQuery

在此部分中,我们将使用可视化无代码界面从 GCS 提取 CSV 文件,对其进行清理,然后将其加载到新的 BigQuery 表中。

启动数据准备并连接到来源

  1. 在 Google Cloud 控制台中,前往 BigQuery Studio。

8825270159447e89.png

  1. 在欢迎页面中,点击“数据准备”卡片即可开始。

8b7b3ce147a55647.png

  1. 如果您是首次使用此功能,可能需要启用必需的 API。点击“Gemini for Google Cloud API”和“BigQuery Unified API”对应的“启用”。启用后,您可以关闭此面板。

e0a128b8b63137e6.png

1ab7db12bd624bff.png

  1. 在主“数据准备”窗口中,点击“选择其他数据源”下的“Google Cloud Storage”。系统会在右侧打开“准备数据”面板。

5ef56d07d54abab4.png

  1. 点击“浏览”按钮以选择源文件。

95899fcbb7383967.png

  1. 前往您之前创建的 GCS 存储分区 (met-artworks-source-...),然后选择 dataprep-met-bqml.csv 文件。点击“选择”。

3590d0841677ad01.png

107797a8f134b248.png

  1. 接下来,您需要配置临时表。
  2. 在“数据集”部分,选择您创建的 met_art_dataset
  3. 在“表名称”中,输入一个名称,例如 temp
  4. 点击“创建”。

694a7064eb1f2109.png

转换和清理数据

  1. BigQuery 的数据准备功能现在会加载 CSV 的预览。找到包含长 JSON 字符串的 label_details_json 列。点击列标题以将其选中。

345e09d8222ef0d6.png

  1. 在右侧的建议面板中,Gemini in BigQuery 会自动建议相关转换。点击“扁平化列 label_details_json”卡片上的“应用”按钮。这会将嵌套字段(descriptionscore 等)提取到各自的顶级列中。

a432edf49f182ea3.png

  1. 点击 object_id 列,然后点击“将列 object_id 从类型 string 转换为 int64”上的“应用”按钮。

46523a5dd6b7c495.png

a190553c0a153393.png

定义目标并运行作业

  1. 在右侧面板中,点击“目标”按钮以配置转换的输出。

90b0d1e641d6ace9.png

  1. 设置目标详细信息:
  2. 数据集应预先填充 met_art_dataset
  3. 为输出输入新的表名称:met_art_flatten_table
  4. 点击“保存”。

cda9b07bfd5ff6a3.png

  1. 点击“运行”按钮,然后等待数据准备作业完成。

9be3f3baecc7ee93.png

  1. 您可以在页面底部的“执行”标签页中监控作业的进度。片刻之后,作业就会完成。

df820e4a5183e9b9.png

f9329c88a7fdb535.png

4. 使用 BQML 生成向量嵌入

现在,我们的数据已清理完毕并结构化,接下来我们将使用 BigQuery ML 执行核心 AI 任务:将艺术品的文本描述转换为数值向量嵌入。

创建 BigQuery 连接

如需允许 BigQuery 与 Vertex AI 服务通信,您必须先创建 BigQuery 连接。

  1. 在 BigQuery Studio 的“探索器”面板中,点击“+ 添加数据”按钮。

eef6c5c73cf8736.png

  1. 在右侧面板中,使用搜索栏输入 Vertex AI。选择该选项,然后从过滤后的列表中选择 BigQuery 联合查询。

32e9632e84dd1ae7.png

7feedffb98bb288a.png

  1. 系统随即会打开“外部数据源”表单。填写以下详细信息:
  • 连接 ID:输入连接 ID(例如,bqml-vertex-connection)
  • 位置类型:确保已选择“多区域”。
  • 位置:选择位置(例如,US)。

c0681e76440a18cd.png

  1. 连接创建完成后,系统会显示一个确认对话框。在“探索器”标签页中,点击“前往连接”或“外部连接”。在连接详细信息页面上,将完整 ID 复制到剪贴板。这是 BigQuery 将用于调用 Vertex AI 的服务账号身份。

fd0d82f3265f1def.png

  1. 在 Google Cloud 控制台导航菜单中,依次前往“IAM 和管理”>“IAM”。

de8a0fe28f8dee8f.png

  1. 点击“授予访问权限”按钮
  2. 将您在上一步中复制的服务账号粘贴到“新的主账号”字段中。
  3. 在“角色”下拉菜单中分配“Vertex AI 用户”,然后点击“保存”。

8b2c89b8c97e37cc.png

此关键步骤可确保 BigQuery 获得适当的授权,以便代表您使用 Vertex AI 模型。

创建远程模型

在 BigQuery Studio 中,打开一个新的 SQL 编辑器标签页。您将在此处定义连接到 Gemini 的 BQML 模型。

此语句不会训练新模型。它只是在 BigQuery 中创建一个引用,该引用使用您刚刚授权的连接指向强大的预训练 gemini-embedding-001 模型。

复制下面的整个 SQL 脚本,然后将其粘贴到 BigQuery 编辑器中。

ba0a9c9d951c0f71.png

CREATE OR REPLACE MODEL `met_art_dataset.embedding_model`
REMOTE WITH CONNECTION `US.bqml-vertex-connection`
OPTIONS (endpoint = 'gemini-embedding-001');

生成嵌入

现在,我们将使用 BQML 模型生成向量嵌入。我们不会简单地为每行转换单个文本标签,而是会采用更复杂的方法,为每件艺术品创建更丰富、更有意义的“语义摘要”。这样可以生成更高质量的嵌入内容,并提供更准确的建议。

此查询执行一个关键的预处理步骤:

  • 它使用 WITH 子句先创建一个临时表。
  • 在其中,我们对每个 object_id 进行 GROUP BY,以将单个艺术品的所有信息合并到一行中。
  • 我们使用 STRING_AGG 函数将所有单独的文本描述(例如“肖像”“女性”“布面油画”)合并为一个全面的文本字符串,并按相关性得分对其进行排序。

这种组合文本为 AI 提供了更丰富的艺术品相关背景信息,从而生成更细致、更强大的矢量嵌入。

在新的 SQL 编辑器标签页中,粘贴并运行以下查询:

CREATE OR REPLACE TABLE `met_art_dataset.artwork_embeddings` AS
WITH artwork_semantic_text AS (
  -- First, we group all text labels for each artwork into a single row.
  SELECT
    object_id,
    ANY_VALUE(title) AS title,
    ANY_VALUE(artist_display_name) AS artist_display_name,
    -- STRING_AGG combines all descriptions into one comma-separated string,
    -- ordering them by score to put the most relevant labels first.
    STRING_AGG(description, ', ' ORDER BY score DESC) AS aggregated_labels
  FROM
    `met_art_dataset.met_art_flatten_table`
  GROUP BY
    object_id
)
SELECT
  *
FROM ML.GENERATE_TEXT_EMBEDDING(
  MODEL `met_art_dataset.embedding_model`,
  (
    -- We pass the new, combined string as the content to be embedded.
    SELECT
      object_id,
      title,
      artist_display_name,
      aggregated_labels AS content
    FROM
      artwork_semantic_text
  )
);

此查询大约需要 10 分钟。查询完成后,验证结果。在“探索器”面板中,找到新的 artwork_embeddings 表,然后点击它。在表架构查看器中,您将看到 object_id、包含向量的新 ml_generate_text_embedding_result 列,以及用作源文本的 aggregated_labels 列。

c894ad3624d710e7.png

5. 使用 SQL 查找相似的艺术作品

创建了高质量、富含上下文信息的向量嵌入后,只需运行 SQL 查询即可轻松找到主题相似的艺术品。我们使用 ML.DISTANCE 函数计算向量之间的余弦相似度。由于我们的嵌入是从汇总文本生成的,因此相似性结果会更准确、更相关。

  1. 在新的 SQL 编辑器标签页中,粘贴以下查询。此查询模拟了推荐应用的核心逻辑:
  • 它首先选择一幅特定艺术品(在本例中为梵高的《柏树》,其 object_id 为 436535)的向量。
  • 然后,它会计算该单个向量与表中的所有其他向量之间的距离。
  • 最后,它会按距离(距离越小表示越相似)对结果进行排序,以找到最接近的前 10 个匹配项。
WITH selected_artwork AS (
  SELECT text_embedding
  FROM `met_art_dataset.artwork_embeddings`
  WHERE object_id = 436535
)
SELECT
  base.object_id,
  base.title,
  base.artist_display_name,
  -- ML.DISTANCE calculates the cosine distance between the two vectors.
  -- A smaller distance means the items are more similar.
  ML.DISTANCE(base.text_embedding, (SELECT text_embedding FROM selected_artwork), 'COSINE') AS similarity_distance
FROM
  `met_art_dataset.artwork_embeddings` AS base, selected_artwork
ORDER BY
  similarity_distance
LIMIT 10;
  1. 运行查询。结果将列出 object_id,最接近的匹配项位于顶部。源艺术品将首先显示,距离为 0。这是 AI 推荐引擎的核心逻辑,您仅使用 SQL 便在 BigQuery 中完全构建了该逻辑。

6. (可选)在 Cloud Shell 中运行演示

为了让您更好地理解此 Codelab 中的概念,您克隆的代码库中包含一个简单的 Web 应用。此可选演示使用您创建的 artwork_embeddings 表来支持视觉搜索引擎,让您了解 AI 驱动的建议的实际效果。

如需在 Cloud Shell 中运行演示,请按照以下步骤操作:

  1. 设置环境变量:在运行应用之前,您需要设置 PROJECT_ID 和 BIGQUERY_DATASET 环境变量。
export PROJECT_ID=$(gcloud config get-value project)
export BIGQUERY_DATASET=met_art_dataset
export REGION='us-central1'
bq cp bigquery-public-data:the_met.images $PROJECT_ID:met_art_dataset.images
  1. 安装依赖项并启动后端服务器。
cd ~/devrel-demos/data-analytics/dataprep/backend/ && npm install
node server.js
  1. 您需要打开第二个终端标签页来运行前端应用。点击“+”图标以打开新的 Cloud Shell 标签页。

bbc9ecde0ff417f4.png

  1. 现在,在新标签页中执行以下命令,以安装依赖项并运行前端服务器
cd ~/devrel-demos/data-analytics/dataprep/frontend/ && npm install
npm run dev
  1. 预览应用:在 Cloud Shell 工具栏中,点击“网页预览”图标,然后选择“在端口 5173 上预览”。系统会打开一个新的浏览器标签页,其中运行着该应用。现在,您可以使用该应用搜索艺术品,并查看相似度搜索的实际效果。

d4dc326a225354c9.png

b9956f2c29af2864.png

  1. 如需将此可视化演示与您在 BigQuery SQL 编辑器中所做的工作关联起来,请尝试在搜索栏中输入“Cypresses”。这与您在 ML.DISTANCE 查询中使用的同一张图片(object_id=436535) 相同。然后,当左侧面板中显示“Cypresses”图片时,点击该图片,您会在右侧看到结果。应用会显示最相似的艺术品,直观地展示您构建的向量相似度搜索的强大功能。

a030b3ee20c8703d.png

7. 清理环境

为避免系统日后因本 Codelab 中使用的资源向您的 Google Cloud 账号收取费用,您应该删除您创建的资源。

在 Cloud Shell 终端中运行以下命令,以移除服务账号、BigQuery 连接、GCS 存储分区和 BigQuery 数据集。

# Re-run these exports if your Cloud Shell session timed out
export PROJECT_ID=$(gcloud config get-value project)
export LOCATION="US"
export GCS_BUCKET_NAME="met-artworks-source-${PROJECT_ID}"
export BQ_CONNECTION_ID="bqml-vertex-connection"

移除 BigQuery 连接和 GCS 存储分区

# Delete the BigQuery connection
bq rm --connection $LOCATION.$BQ_CONNECTION_ID

# Delete the GCS bucket and its contents
gcloud storage rm --recursive gs://$GCS_BUCKET_NAME

删除 BigQuery 数据集

最后,删除 BigQuery 数据集。此命令不可撤消。-f(强制)标志会移除数据集及其所有表,而不会提示您进行确认。

# Manually type this command to confirm you are deleting the correct dataset
bq rm -r -f --dataset $PROJECT_ID:met_art_dataset

8. 恭喜!

您已成功构建端到端 AI 赋能的数据流水线。

您首先从 GCS 存储分区中的原始 CSV 文件入手,使用 BigQuery Data Prep 的低代码界面来提取和扁平化复杂的 JSON 数据,创建了一个强大的 BQML 远程模型,以使用 Gemini 模型生成高质量的向量嵌入,并执行了相似性搜索查询来查找相关商品。

现在,您已掌握在 Google Cloud 上构建 AI 辅助工作流的基本模式,能够快速轻松地将原始数据转换为智能应用。

接下来该怎么做?

  • 在 Looker Studio 中直观呈现结果:将 artwork_embeddings BigQuery 表直接连接到 Looker Studio(免费!)。您可以构建一个互动式信息中心,让用户无需编写任何前端代码即可选择一件艺术品,并查看最相似作品的视觉图库。
  • 使用预定查询实现自动化:您无需使用复杂的编排工具即可让嵌入保持最新状态。使用 BigQuery 的内置“计划查询”功能,每天或每周自动重新运行 ML.GENERATE_TEXT_EMBEDDING 查询。
  • 使用 Gemini CLI 生成应用:只需以纯文本描述您的要求,即可使用 Gemini CLI 生成完整的应用。这样,您无需手动编写 Python 代码,即可快速构建用于相似性搜索的可行原型。
  • 阅读文档