如何从Airflow(Cloud Composer)向GCP Dataform传递变量?
GCP Dataform 实现参数化SQL(适配多国家/城市场景)
基本实现方式
Dataform通过变量(Variables)结合JS模板语法,实现和Airflow类似的参数化能力,不管是SQLX脚本还是数据源配置都能适配多场景需求。
1. 定义变量(默认或外部传入)
可以在项目根目录的dataform.json里设置默认变量,也能在运行时从外部(比如Airflow)传参覆盖:
- 示例
dataform.json默认配置:
{ "defaultSchema": "your_default_schema", "variables": { "country": "us", "city": "nyc" } }
- Airflow调用时动态传参:用DataformOperator的
variables参数指定,比如variables={"country": "uk", "city": "london"},即可覆盖默认变量值。
2. SQLX脚本中使用变量
把Airflow的{{params.variable}}替换成Dataform的${var("变量名")}语法即可:
config { type: "view" } SELECT id, name FROM `${var("country")}_dataset.abc123_${var("city")}_table`
3. 数据源(source)配置中使用变量
在source定义里同样支持${var()}语法,两种写法可选:
写法一:直接在SQL语句中引用
config { type: "source" } SELECT * FROM `${var("country")}_dataset.abc123_${var("city")}_table`
写法二:在source的字段中拼接变量
source { name: `${var("country")}_dataset.abc123_${var("city")}_table`, schema: `${var("country")}_dataset` }
4. 批量生成多实例任务(可选)
如果需要一次性生成所有国家/城市的对应任务,用JS循环自动生成即可:
在definitions目录下创建generate_tables.js文件:
const countries = ["us", "uk", "fr"]; const cities = ["nyc", "london", "paris"]; countries.forEach(country => { cities.forEach(city => { publish(`${country}_${city}_view`) .type("view") .query(ctx => ` SELECT id, name FROM ${country}_dataset.abc123_${city}_table `); }); });
执行后会自动生成每个国家+城市组合的视图任务,无需手动编写多个SQLX文件。
内容的提问来源于stack exchange,提问作者Christoffer
相关产品推荐
相关产品推荐

