BigQueryCLI数据查询技能指南Skill bigquery

本技能指南详细介绍了如何使用BigQuery命令行工具(bq)进行数据仓库查询和元数据检查,特别针对Monzo公司的数据分析项目。内容涵盖INFORMATION_SCHEMA元数据查询、数据敏感性处理、表结构检查、行数统计、模式匹配等核心功能,适用于数据工程师、分析师和开发人员进行安全高效的数据探索和验证工作。关键词:BigQuery CLI, bq命令, 数据仓库查询, INFORMATION_SCHEMA, 元数据检查, 数据敏感性, 表结构分析, 数据工程工具, Google Cloud, 数据分析工作流

数据仓库 4 次安装 20 次浏览 更新于 3/2/2026

name: bigquery description: 使用BigQuery CLI (bq)查询和检查Monzo BigQuery项目中表的综合指南,重点强调数据敏感性和INFORMATION_SCHEMA查询。

BigQuery CLI 技能

本技能提供使用BigQuery CLI (bq)查询和检查Monzo BigQuery项目中数据的全面指导。

核心原则

  1. 始终明确指定项目 使用 --project_id=PROJECT_NAME
  2. 始终使用标准SQL 使用 --use_legacy_sql=false
  3. 尊重数据敏感性 - 避免查询敏感表中的实际内容
  4. 使用INFORMATION_SCHEMA 进行元数据查询(模式、列、表)

常见查询模式

1. 检查表模式 (INFORMATION_SCHEMA)

使用此方法检查列名、类型和结构而不访问敏感数据

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT column_name, data_type, is_nullable
   FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'TABLE_NAME'
   ORDER BY ordinal_position"

示例:

# 检查dims数据集表模式
bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT column_name, data_type FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'vulnerable_customer_logs_dim' ORDER BY ordinal_position"

# 检查prod数据集表模式
bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT column_name, data_type FROM \`monzo-analytics.prod.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'transactions' ORDER BY ordinal_position"

2. 统计行数(对敏感表安全)

使用 COUNT(*) 检查表大小而不暴露数据:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT COUNT(*) as row_count FROM \`monzo-analytics.DATASET.TABLE_NAME\`"

示例:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT COUNT(*) as row_count FROM \`monzo-analytics.dims.vulnerable_customer_logs_dim\`"

3. 列出数据集中的所有表

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT table_name, table_type
   FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.TABLES\`
   ORDER BY table_name"

示例:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT table_name FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.TABLES\`
   ORDER BY table_name"

4. 导出模式到文件

用于表模式的程序化处理:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  --format=csv --quiet \
  "SELECT column_name FROM \`monzo-analytics.DATASET.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'TABLE_NAME' ORDER BY ordinal_position" \
  | tail -n +2 > /tmp/columns.txt

示例:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  --format=csv --quiet \
  "SELECT column_name FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'vulnerable_customer_logs_dim' ORDER BY ordinal_position" \
  | tail -n +2 > /tmp/columns.txt

5. 检查表元数据

获取表创建时间、大小和其他元数据:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT
     table_name,
     creation_time,
     ROUND(size_bytes/1024/1024/1024, 2) as size_gb,
     row_count
   FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.TABLES\`
   WHERE table_name = 'TABLE_NAME'"

6. 按模式查找表

搜索匹配命名模式的表:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT table_name
   FROM \`monzo-analytics.DATASET_NAME.INFORMATION_SCHEMA.TABLES\`
   WHERE table_name LIKE '%PATTERN%'
   ORDER BY table_name"

示例:

# 查找所有客户相关表
bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT table_name FROM \`monzo-analytics.dims.INFORMATION_SCHEMA.TABLES\`
   WHERE table_name LIKE '%customer%' ORDER BY table_name"

7. 获取详细的列信息

获取包括描述在内的全面列元数据:

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT
     column_name,
     data_type,
     is_nullable,
     is_partitioning_column
   FROM \`monzo-analytics.DATASET.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'TABLE_NAME'
   ORDER BY ordinal_position"

8. 采样数据(仅限非敏感表)

⚠️ 警告: 仅对非敏感表使用。切勿查询人员/员工/PII表中的实际内容。

bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT * FROM \`monzo-analytics.DATASET.TABLE_NAME\` LIMIT 10"

输出格式化选项

控制结果如何显示:

# CSV格式
--format=csv

# JSON格式
--format=json

# 美观表格格式(默认)
--format=prettyjson

# 静默模式(无状态消息)
--quiet

# 返回的最大行数
--max_rows=100

常见项目和数据集

主要分析项目

  • monzo-analytics - 主要分析仓库
  • monzo-analytics-v2 - 新OOM架构模型
  • monzo-analytics-pii - 包含PII的数据(谨慎使用)
  • sanitized-events-prod - 清理后的事件数据
  • raw-analytics-events-prod - 原始事件数据

常见数据集

  • dims - 维度表
  • prod - 生产表
  • lending - 贷款特定表
  • slurpee - Slurpee数据

数据敏感性指南

✅ 安全操作(始终允许)

  1. INFORMATION_SCHEMA查询 - 这些仅返回元数据,而非实际数据
  2. COUNT(*)查询 - 这些仅返回行数
  3. 模式检查 - 列名、类型、表结构

⚠️ 受限操作(谨慎使用)

  1. 查询实际内容 来自:

    • 人员/员工数据表
    • 包含PII的表
    • 客户财务数据
    • 认证/安全表
  2. 如有疑问:

    • 坚持使用INFORMATION_SCHEMA查询
    • 使用COUNT(*)验证表是否存在
    • 在查询实际内容前询问用户

🚫 切勿执行此操作

  • peoplestaffhibob表查询实际行
  • 将PII数据导出到本地文件
  • 查询认证凭据或令牌
  • 未经明确许可访问客户财务详情

错误处理

常见错误和解决方案

错误:“未找到:表”

# 解决方案:首先检查表是否存在
bq query --project_id=monzo-analytics --use_legacy_sql=false \
  "SELECT table_name FROM \`monzo-analytics.DATASET.INFORMATION_SCHEMA.TABLES\`
   WHERE table_name LIKE '%SEARCH_TERM%'"

错误:“访问被拒绝”

# 解决方案:您可能没有该项目/数据集的权限
# 尝试其他项目或询问用户关于访问权限

错误:“语法错误”

# 解决方案:确保使用标准SQL (--use_legacy_sql=false)
# 检查项目.dataset.table标识符的反引号使用

最佳实践

  1. 始终使用完全限定的表名 并加反引号:

    `project-id.dataset.table`
    
  2. 对探索性查询使用LIMIT 以避免大型结果集:

    SELECT * FROM `project.dataset.table` LIMIT 10
    
  3. 在运行昂贵查询前检查行数

    # 首先检查大小
    bq query --project_id=monzo-analytics --use_legacy_sql=false \
      "SELECT COUNT(*) FROM \`project.dataset.table\`"
    
    # 如果合理再运行完整查询
    
  4. 使用dry-run进行成本估算(针对昂贵查询):

    bq query --dry_run --use_legacy_sql=false "YOUR_QUERY_HERE"
    
  5. 将大型结果导出到文件

    bq query --project_id=monzo-analytics --use_legacy_sql=false \
      --format=csv "YOUR_QUERY" > output.csv
    

快速参考命令

# 模式检查
bq query --project_id=PROJECT --use_legacy_sql=false \
  "SELECT column_name, data_type FROM \`PROJECT.DATASET.INFORMATION_SCHEMA.COLUMNS\`
   WHERE table_name = 'TABLE' ORDER BY ordinal_position"

# 行数统计
bq query --project_id=PROJECT --use_legacy_sql=false \
  "SELECT COUNT(*) FROM \`PROJECT.DATASET.TABLE\`"

# 列出表
bq query --project_id=PROJECT --use_legacy_sql=false \
  "SELECT table_name FROM \`PROJECT.DATASET.INFORMATION_SCHEMA.TABLES\`
   ORDER BY table_name"

# 表元数据
bq query --project_id=PROJECT --use_legacy_sql=false \
  "SELECT table_name, row_count, size_bytes
   FROM \`PROJECT.DATASET.INFORMATION_SCHEMA.TABLES\`
   WHERE table_name = 'TABLE'"

何时使用此技能

在需要时调用此技能:

  • 查询BigQuery表或数据集
  • 检查表模式或列类型
  • 统计行数或检查表是否存在
  • 导出表元数据
  • 在运行dbt模型前验证数据
  • 调查数据问题或表结构
  • 按命名模式查找表

与dbt工作流集成

在分析存储库中处理dbt模型时:

  1. 创建导入模型前 - 使用BigQuery CLI检查源模式
  2. 运行dbt前 - 验证源表存在并具有预期结构
  3. 调试dbt失败 - 查询实际表以了解数据问题
  4. 验证生成器 - 检查源和生成器之间的列类型是否匹配

记住:始终尊重数据敏感性指南,并尽可能使用INFORMATION_SCHEMA。