You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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已在后续迭代中修复。
  • 规范SQL结构:删除UNION ALL分支内部的ORDER BY语句,将所有排序逻辑统一放到最外层查询实现。

内容的提问来源于stack exchange,提问作者Ricardo Francois

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:57:22