name: bigquery description: 使用BigQuery CLI (bq)查询和检查Monzo BigQuery项目中表的综合指南,重点强调数据敏感性和INFORMATION_SCHEMA查询。
BigQuery CLI 技能
本技能提供使用BigQuery CLI (bq)查询和检查Monzo BigQuery项目中数据的全面指导。
核心原则
- 始终明确指定项目 使用
--project_id=PROJECT_NAME - 始终使用标准SQL 使用
--use_legacy_sql=false - 尊重数据敏感性 - 避免查询敏感表中的实际内容
- 使用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数据
数据敏感性指南
✅ 安全操作(始终允许)
- INFORMATION_SCHEMA查询 - 这些仅返回元数据,而非实际数据
- COUNT(*)查询 - 这些仅返回行数
- 模式检查 - 列名、类型、表结构
⚠️ 受限操作(谨慎使用)
-
查询实际内容 来自:
- 人员/员工数据表
- 包含PII的表
- 客户财务数据
- 认证/安全表
-
如有疑问:
- 坚持使用INFORMATION_SCHEMA查询
- 使用COUNT(*)验证表是否存在
- 在查询实际内容前询问用户
🚫 切勿执行此操作
- 从
people、staff、hibob表查询实际行 - 将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标识符的反引号使用
最佳实践
-
始终使用完全限定的表名 并加反引号:
`project-id.dataset.table` -
对探索性查询使用LIMIT 以避免大型结果集:
SELECT * FROM `project.dataset.table` LIMIT 10 -
在运行昂贵查询前检查行数:
# 首先检查大小 bq query --project_id=monzo-analytics --use_legacy_sql=false \ "SELECT COUNT(*) FROM \`project.dataset.table\`" # 如果合理再运行完整查询 -
使用dry-run进行成本估算(针对昂贵查询):
bq query --dry_run --use_legacy_sql=false "YOUR_QUERY_HERE" -
将大型结果导出到文件:
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模型时:
- 创建导入模型前 - 使用BigQuery CLI检查源模式
- 运行dbt前 - 验证源表存在并具有预期结构
- 调试dbt失败 - 查询实际表以了解数据问题
- 验证生成器 - 检查源和生成器之间的列类型是否匹配
记住:始终尊重数据敏感性指南,并尽可能使用INFORMATION_SCHEMA。