Airflow调用BigQuery API运行SQL报错Encountered "FROM" "FROM "
问题现象
- BigQuery作业调度运行失败,抛出错误:
Encountered " "FROM" "FROM ",提示SQL存在重复FROM关键字 - 同一段SQL在BigQuery控制台工作区手动执行可正常运行,通过Airflow调用BigQuery API调度执行时才触发报错
- 错误日志定位到SQL第4行第20个字符,对应代码片段为
, EXTRACT(DATE FROM event_time) AS session_date,手动检查编写的SQL源码,未发现连续书写两个FROM的错误写法 - 查询中使用了
LEAD()窗口函数、COALESCE()函数,包含UNION ALL、UNNEST嵌套子查询结构,原始SQL结构如下:
SELECT * FROM ((SELECT fields_here FROM table_name LEFT JOIN UNNEST(sub_table) AS s WHERE 1=1 UNION ALL (SELECT fields_here FROM table_name LEFT JOIN UNNEST(sub_table) AS s WHERE 1=1 ORDER BY 1, 2)) ORDER BY 1, 2
报错根因
该报错和LEAD()、COALESCE()函数无关联,核心原因是Airflow侧的SQL预处理逻辑与BigQuery方言解析存在冲突:
- 多数Airflow BigQuery Operator默认自带SQL模板渲染、参数替换逻辑,会通过正则匹配识别SQL内的关键字、占位符做文本替换。部分旧版本Operator的正则匹配规则存在缺陷,会将
EXTRACT(DATE FROM 字段名)语法中属于函数参数部分的FROM,误识别为查询语句的主FROM关键字,在自动格式化/补全过程中错误插入额外的FROM,最终传递给BigQuery API的SQL文本就出现了FROM FROM的非法语法。 - BigQuery控制台手动执行SQL时,不会经过Airflow的模板渲染流程,原始SQL直接提交给BigQuery解析,因此可以正常运行;调度场景下SQL先被Airflow修改再下发,就会出现源码无错误、执行时报重复FROM的现象。日志将错误点定位到
EXTRACT(DATE FROM event_time)行,也可以直接佐证这个判断。 - 额外说明:贴出的SQL结构本身存在不规范写法:UNION ALL的第二个子查询分支内部单独写了
ORDER BY 1,2,该排序在BigQuery的子查询、UNION分支中不会生效,极端场景下也可能触发解析异常。
排查解决方法
- 先定位实际下发的SQL文本:进入Airflow对应任务实例的日志页面,查看「Rendered Template」板块展示的最终渲染后SQL,即可确认是否在
EXTRACT(DATE FROM位置被错误插入了额外的FROM。 - 按需选择修复方案:
- 关闭对应BigQuery Operator的自动SQL渲染/格式化配置,比如将
sql_render=True类参数修改为False,让Airflow直接传递原始SQL文本给BigQuery,不做额外的文本处理。 - 调整SQL写法绕开错误正则匹配:将
EXTRACT(DATE FROM event_time)替换为等价的DATE(event_time),两者返回结果完全一致,且写法中不包含FROM关键字,不会触发Airflow的错误匹配。 - 将Airflow BigQuery Provider升级到最新稳定版本,旧版本存在的SQL解析正则bug已在后续迭代中修复。
- 关闭对应BigQuery Operator的自动SQL渲染/格式化配置,比如将
- 规范SQL结构:删除UNION ALL分支内部的
ORDER BY语句,将所有排序逻辑统一放到最外层查询实现。
内容的提问来源于stack exchange,提问作者Ricardo Francois
相关产品推荐
相关产品推荐

