Snowflake中UDF关联查询报错:RSP.ID标识符无效问题排查
Why does single UDF query work but JOIN query throws
invalid identifier 'RSP.ID' in Snowflake? 这种情况在Snowflake处理表值UDF的关联查询时挺常见的,我来给你拆解下可能的原因和解决办法:
1. 你的表值UDF可能没明确定义返回结构
如果UDF_1只是返回一个结果集,但没有在定义时显式指定TABLE的列名和数据类型,Snowflake在单独查询时可以临时推断列名,但到了关联场景下,编译器没办法可靠地识别这些列,就会把RSP.ID当成无效标识符。
举个例子,正确的表值UDF定义应该是这样的(明确返回列):
CREATE OR REPLACE FUNCTION UDF_1(input_ts TIMESTAMP_LTZ) RETURNS TABLE(id INT, timestamp TIMESTAMP_LTZ) AS $$ -- 这里是你的UDF逻辑,比如从某个表筛选数据 SELECT user_id AS id, event_ts AS timestamp FROM event_log WHERE event_ts = input_ts $$;
如果之前的UDF没这么定义,重新调整下UDF的返回结构就能解决问题。
2. 关联时需要加上LATERAL关键字
Snowflake对多个表值函数的JOIN支持有个小细节:有时候默认的JOIN语法没办法正确解析左侧UDF结果集的别名,这时候加上LATERAL关键字就能让编译器正确识别左侧的列了。
修改后的查询可以写成这样:
SELECT rsp.id FROM TABLE(UDF_1('2019-04-18 12:00:00'::timestamp_ltz)) AS rsp JOIN LATERAL TABLE(UDF_2('2019-04-18 12:00:00'::timestamp_ltz)) AS rasp ON rsp.id = rasp.id AND rsp.timestamp = rasp.start;
要是你不需要LATERAL的依赖关联(比如两个UDF的输入都是固定值),也可以试试用逗号分隔两个表值函数,再用WHERE条件关联:
SELECT rsp.id FROM TABLE(UDF_1('2019-04-18 12:00:00'::timestamp_ltz)) AS rsp, TABLE(UDF_2('2019-04-18 12:00:00'::timestamp_ltz)) AS rasp WHERE rsp.id = rasp.id AND rsp.timestamp = rasp.start;
3. 用子查询包装UDF结果集,明确暴露列名
有时候Snowflake的查询编译器会优先解析右侧的表元素,导致左侧的rsp别名还没被注册到上下文里。这时候把每个TABLE(UDF)的结果包装成子查询,明确写出要返回的列,就能让编译器正确识别别名了:
SELECT rsp.id FROM (SELECT id, timestamp FROM TABLE(UDF_1('2019-04-18 12:00:00'::timestamp_ltz))) AS rsp JOIN (SELECT id, start FROM TABLE(UDF_2('2019-04-18 12:00:00'::timestamp_ltz))) AS rasp ON rsp.id = rasp.id AND rsp.timestamp = rasp.start;
内容的提问来源于stack exchange,提问作者user43395
相关产品推荐
相关产品推荐

