首页 > 解决方案 > 如果“from”子句不匹配任何结果,如何编写空表?

问题描述

我正在使用 Apache Airflow 构建一个管道,根据其数据表为某个项目的每周生成报告。

我的第二个任务是获取适当的数据来生成关于过去 4 周活动的图表。但是,对于日期等于我的 dag 的第一次运行,我使用BigQueryOperatorstart_start收到以下错误:

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 子句不匹配任何结果,如何编写一个空表。这将是我的问题的解决方案。

我知道我可以创建一个有条件的任务,但我正在寻找一种不会改变“已经在工作”的解决方案。我的意思是,这不会改变影响其他任务。

甚至可以使用 SQL 或/和 Jinja2 语句吗?

标签: sqlpython-3.xgoogle-bigqueryjinja2airflow

解决方案


您可以使用 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

推荐阅读