我正在使用Apache Airflow构建管道,根据其数据表为每个项目的每周生成报告。
我的第二项任务获得了适当的数据,以生成有关最近四周活动的图表。但是,对于第一次运行,其日期等于我的行为start_start
,我使用BigQueryOperator遇到以下错误:
Error: FROM clause with table wildcards matches no table
因此,我正在尝试使用Jinja2模板获取不存在的表。
我的代码:
t2 = BigQueryOperator(
task_id='create_agg_last_four_wks_prof',
bql=None,
bql="""
#legacySql
SELECT
date_wk,
mun,
names,
count(unique(if(plans>=1, cpf, 0))) as plans,
count(unique(cpf)) as num_prof
FROM
TABLE_DATE_RANGE([kos.agg_wk_prof_],
TIMESTAMP('{{ macros.ds_add(ds, -28) }}'),
TIMESTAMP('{{ macros.ds_add(ds, -7) }}'))
WHERE
project = true
GROUP BY
date_wk, mun, names
""",
destination_dataset_table="xcfz-edu:kos.test_agg_last_four_wks_prof_{{ ds_nodash }}",
write_disposition="WRITE_TRUNCATE",
dag=dag
所以,我想知道如果from子句不匹配结果怎么写一个空表。这将是解决我的问题的方法。
我知道我可以创建一个conditional task,但是我正在寻找一种不会改变“已经工作的东西”的解决方案。我的意思是,这不会改变影响其他任务。
甚至可以使用SQL或/和Jinja2语句吗?
答案 0 :(得分:1)
您可以在BigQuery中使用标准SQL来做到这一点:
SELECT
date_wk,
mun,
names,
count(DISTINCT if(plans>=1, cpf, 0)) as plans,
count(DISTINCT cpf) as num_prof
FROM
`pdc.agg_wk_prof_*`
WHERE
_TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY)) AND
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)) AND
project = true
GROUP BY
date_wk, mun, names