类似传统的数据库,但还是稍有差别
AI:BigQuery 是 Google Cloud(GCP)上的全托管数据仓库与分析引擎,用来在超大规模数据集上做高速 SQL 分析,而且几乎不用管集群、运维和扩缩容。
DataSet (约等于Database) → Table → SQL操作
BigQuery 是 Google Cloud 提供的一個 全代管 (serverless)、高擴展性的大數據分析資料倉儲服務。它的主要特點是:
使用者不需要自己維護伺服器或資料庫基礎設施。BigQuery 會自動處理運算資源、儲存空間以及擴展需求,你只需要專注於資料分析。
BigQuery 使用標準 SQL(ANSI SQL)語法,讓資料分析師和工程師可以很快上手,不需要學習新的查詢語言。
BigQuery 專為 大規模資料集 設計,能處理 數百 TB 甚至 PB 級別的資料,並且依靠 Google 的分散式基礎架構,查詢速度非常快。
費用主要分兩部分:
這意味著如果資料不常查詢,成本相對較低。
BigQuery 可以與 Google Cloud 其他服務(如 Dataflow、Dataproc、Pub/Sub)、以及常見工具(如 Google Sheets、Looker Studio、Tableau)無縫整合。
一定要在本地先配置好 ADC 之后才能运行,参考gcloud CLI
https://github.com/GZhonghui/GCP/tree/master/big_query
查看表结构
执行SQL语句
# 在命令行执行 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'
# 表格查看 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 -- 这样会出错,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;