编写Flink UDF 要注意幂等性,尤其不能直接修改入参!理论上是一条数据只会执行一次UDF,但是实际执行过程中可能会对一条数据执行多次UDF,引起意想不到的问题。
例如有如下SQL:
CREATE VIEW tmp_view AS
SELECT a.id AS id
, my_udf_1(
myudf_2(a.v) AS v
FROM table_a a
LEFT OUTER JOIN table_b FOR SYSTEM_TIME AS OF a.proctime b
ON a.id = b.key
;INSERT INTO table_c
SELECT id
, v
FROM tmp_view
;
正常my_udf_2确实只会执行一次,但如果sql变一下,最后INSERT那里加入一个where条件,UDF就会下推到Where条件中再执行一次:
这个时候如果UDF不能保证幂等性,计算结果就会出错。例如入参是个List,第一次执行UDF时改了传入的List中的数据,第二次UDF执行时会在第一次执行的基础上再次改变传入的List中的数据,结果就不正确了!
参考:
Flink SQL UDF重复调用问题解决方案-腾讯云开发者社区-腾讯云