Zhonghui

每个不曾起舞的日子,都是对生命的辜负

User Tools

Site Tools


软件:linux:bigquery

GCP: BigQuery

类似传统的数据库,但还是稍有差别

AI:BigQuery 是 Google Cloud(GCP)上的全托管数据仓库与分析引擎,用来在超大规模数据集上做高速 SQL 分析,而且几乎不用管集群、运维和扩缩容。


介绍

DataSet (约等于Database) → Table → SQL操作

AI介绍

BigQuery 是 Google Cloud 提供的一個 全代管 (serverless)、高擴展性的大數據分析資料倉儲服務。它的主要特點是:

1. 全代管、無伺服器 (Serverless)

使用者不需要自己維護伺服器或資料庫基礎設施。BigQuery 會自動處理運算資源、儲存空間以及擴展需求,你只需要專注於資料分析。

2. SQL 查詢介面

BigQuery 使用標準 SQL(ANSI SQL)語法,讓資料分析師和工程師可以很快上手,不需要學習新的查詢語言。

3. 超大規模資料處理

BigQuery 專為 大規模資料集 設計,能處理 數百 TB 甚至 PB 級別的資料,並且依靠 Google 的分散式基礎架構,查詢速度非常快。

4. 按需付費

費用主要分兩部分:

  • 儲存費用:依據資料存放量計費。
  • 查詢費用:依據查詢時掃描的資料量(按 TB 計價)。

這意味著如果資料不常查詢,成本相對較低。

5. 與 Google 生態整合

BigQuery 可以與 Google Cloud 其他服務(如 Dataflow、Dataproc、Pub/Sub)、以及常見工具(如 Google Sheets、Looker Studio、Tableau)無縫整合。

一些基础概念

表的分类

  1. 标准(内部/原生)表:数据存放在 BigQuery 自己的列式存储里(执行INSERT插入的数据)
  2. 外部表(统称,数据不在 BigQuery 存储中):一般是指定、关联到一个在GCS(Google Cloud Storage)的文件
  3. 表的快照、克隆之类的

参考代码

一定要在本地先配置好 ADC 之后才能运行,参考gcloud CLI
https://github.com/GZhonghui/GCP/tree/master/big_query

查看表结构

执行SQL语句

bq 命令

# 在命令行执行 query
# 使用常量字符串,并传递了参数,在 BQ 内部使用 "@" 访问参数
# 注意参数不能用作 table 的路径
bq query \
    --use_legacy_sql=false --format=csv --dataset_id=ad_mkt_test \
    --parameter=dt:STRING:"1970-01-01" --max_rows="100" \
    "select user_id, json from user_master where dt = PARSE_DATE('%Y-%m-%d', @dt);"
 
# 使用 SQL 代码文件
DS="study-472607.demo_ds"
bq query \
  --use_legacy_sql=false \
  --parameter=ds::STRING:"$DS" \
  --parameter=table_path::STRING:"study-472607.demo_ds.results" \
  < main.sql
 
# 列出可访问的所有项目
bq ls --projects
 
# 机器可读
bq ls --projects --format=prettyjson
bq ls --projects --format=csv
 
# 查看某个“其他项目”下的 datasets
bq ls --project_id=<OTHER_PROJECT_ID>
 
# 列出 dataset 中所有表/视图
bq ls PROJECT_ID:DATASET
bq ls --format=prettyjson PROJECT_ID:DATASET
 
# 看完整表元数据(包含分区、分簇、行数、大小等)
bq show --format=prettyjson ad-ultra-dev:ad_mkt.user_master
 
# 导出数据(只能导出到 GCS)
bq extract ...
 
# 进入交互式 shell 并指定默认 dataset
bq shell --default_dataset=my-proj:sales --use_legacy_sql=false
# 以下命令暂未验证
 
# 列出 BigQuery 数据集
bq ls
 
# 创建 dataset(区域:东京)
bq --location=asia-northeast1 mk --dataset ${PROJECT_ID}:demo_ds
 
# 创建表:messages
bq mk --table ${PROJECT_ID}:demo_ds.messages \
  id:INT64,msg:STRING,created_at:TIMESTAMP
 
# 插入几行测试数据(Standard SQL)
bq query --use_legacy_sql=false \
'INSERT INTO `PROJECT_ID.demo_ds.messages` (id,msg,created_at) VALUES
 (1,"hello", CURRENT_TIMESTAMP()),
 (2,"konnichiwa", CURRENT_TIMESTAMP())'
 
# 查询验证
bq query --use_legacy_sql=false \
'SELECT * FROM `PROJECT_ID.demo_ds.messages`
 ORDER BY created_at DESC LIMIT 10'

query

# 表格查看
bq query --format=pretty 'SELECT ...'
+----+-------+
| id | name  |
+----+-------+
| 1  | Alice |
| 2  | Bob   |
+----+-------+
 
# 精简表格
bq query --format=sparse 'SELECT ...'
id  name
1   Alice
2   Bob
 
# JSON(紧凑/带缩进)
bq query --format=json 'SELECT ...'
[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]
 
bq query --format=prettyjson 'SELECT ...'
[
  { "id": 1, "name": "Alice" },
  { "id": 2, "name": "Bob" }
]
 
# 导出 CSV(自带表头)
bq query --format=csv 'SELECT ...' > out.csv
id,name
1,Alice
2,Bob
 
# 静默执行
bq query --format=none 'SELECT ...'

BigQuery SQL 语法

-- BigQuery SQL
 
-- 这样会出错,DELETE 必须要有 WHERE 条件
DELETE FROM @table_path;
-- 正确清空 table,路径可以加反引号(推荐),也可以不加
DELETE FROM `study-472607.demo_ds.results` WHERE TRUE;
DELETE FROM study-472607.demo_ds.results WHERE TRUE;
 
-- 参数不能用作 table 的路径(只能硬编码)
DELETE FROM @ds.results;
 
-- 路径写法
-- `project.ds.table`(写全)
-- `ds.table`(使用默认 project)
-- `table`(bq query的时候,通过参数指定ds,比如:--dataset_id=ad_mkt_test)
 
-- 【AI】最常用 8 条 BigQuery 专属写法
-- 1) 选全表但排除/替换部分列
SELECT * EXCEPT(secret), * REPLACE(UPPER(name) AS name) FROM t;
 
-- 2) 用 QUALIFY 过滤窗口函数结果
SELECT *, ROW_NUMBER() OVER(PARTITION BY k ORDER BY ts DESC) rn
FROM t
QUALIFY rn = 1;
 
-- 3) 打散数组,保留位置
SELECT x, pos
FROM UNNEST(arr) AS x WITH OFFSET AS pos
ORDER BY pos;
 
-- 4) 安全转换 / 安全索引
SELECT SAFE_CAST(v AS INT64), arr[SAFE_OFFSET(10)] FROM t;
 
-- 5) PIVOT/UNPIVOT
SELECT * FROM t
UNPIVOT (val FOR metric IN (m1, m2, m3));
 
-- 6) UNION 对齐列名而非列位
SELECT a, b UNION ALL BY NAME SELECT b, a;
 
-- 7) 通配表 + _TABLE_SUFFIX
SELECT * FROM `proj.ds.daily_*` WHERE _TABLE_SUFFIX >= '20250901';
 
-- 8) 参数化查询(命名参数)
SELECT * FROM t WHERE created_at >= @START AND user_id = @uid;
/var/www/DokuWikiStick/dokuwiki/data/pages/软件/linux/bigquery.txt · Last modified: 2025/10/11 09:23 by zhonghui