Airflow Snowflake Operator调试:动态日期CTE与JSON变量展开问题
问题分析:Snowflake SQL编译错误(parse error near )
问题描述
在SQL文件中定义了多个变量并运行CTE,但无法定位问题。设置了日期范围变量,还有一个存储JSON对象的变量(后续将展开用作变量列表),怀疑问题与引号标识符有关。从Airflow收到如下SQL编译错误:
SQL compilation error:
parse error line 5 at position 65 near ''
无法在报错提示的行/位置找到问题,以下是简化后的脚本示例:
SET MAX_DATE = ( SELECT CASE WHEN DATEDIFF(DAY, SALES_DATE, CURRENT_DATE()) > 7 THEN DATEADD(DAY, 7, SALES_DATE) ELSE SALES_DATE END FROM SALES LIMIT 1 ); SET MIN_DATE = DATEADD(WEEK, -52, $MAX_DATE); SET KEY_STORES = '["STORE A","STORE B","STORE C","STORE D"]' ; WITH SALES AS ( SELECT * FROM SALES_ORDERS SO WHERE SO.SALES_DATE BETWEEN $MIN_DATE AND $MAX_DATE ), STORES AS ( SELECT VALUE::VARCHAR(50) AS STORE_NAME FROM TABLE(FLATTEN(INPUT => PARSE_JSON($KEY_STORES))) ) SELECT * FROM SALES INNER JOIN STORES ON SALES.STORE = STORES.STORE_NAME ;
问题原因及解决方案
核心原因:CTE与原表命名冲突
你的CTE命名为SALES,但在MAX_DATE的子查询中也引用了FROM SALES。Snowflake解析器按从上到下顺序处理语句,执行SET MAX_DATE时,后续的CTESALES还未定义,但解析器会优先识别同名的CTE,导致找不到对应的表定义,进而触发<EOF>解析错误——这也是报错指向行5附近的原因(该行属于FROM SALES所在的子查询)。
其他次要可能原因
- JSON字符串转义问题:原代码中使用
"转义引号,Airflow传递SQL时可能因转义处理不当导致解析中断,建议直接使用双引号并以单引号包裹整个JSON字符串(如示例修改后的写法)。 - 变量定义格式问题:部分Snowflake版本对多行子查询的
SET语句解析敏感,可将子查询压缩为单行以避免格式问题。
修正后的脚本示例
SET MAX_DATE = (SELECT CASE WHEN DATEDIFF(DAY, SALES_DATE, CURRENT_DATE()) > 7 THEN DATEADD(DAY, 7, SALES_DATE) ELSE SALES_DATE END FROM SALES LIMIT 1); SET MIN_DATE = DATEADD(WEEK, -52, $MAX_DATE); SET KEY_STORES = '["STORE A","STORE B","STORE C","STORE D"]'; -- 修改CTE名称,避免与原表SALES重名 WITH SALES_CTE AS ( SELECT * FROM SALES_ORDERS SO WHERE SO.SALES_DATE BETWEEN $MIN_DATE AND $MAX_DATE ), STORES AS ( SELECT VALUE::VARCHAR(50) AS STORE_NAME FROM TABLE(FLATTEN(INPUT => PARSE_JSON($KEY_STORES))) ) SELECT * FROM SALES_CTE INNER JOIN STORES ON SALES_CTE.STORE = STORES.STORE_NAME;
内容的提问来源于stack exchange,提问作者Bryan Tran
相关产品推荐
相关产品推荐

