hi Yichao, 目前 planner 会 try best 的将两个相邻的 project 节点合并在一起,除非两个project被分开。 就像你上面的那种做法。但是加一个group by的执行代价比较高。 对于blink planner 而言,*有一个绕的办法*,可以在子查询的结果加一个print sink(可以ignore输出), 利用多sink的优化特性,将两个project分开,从而阻止优化器将两个project合并。
Best, Godfrey 1048262223 <[email protected]> 于2020年6月4日周四 下午4:56写道: > Hi all > > > 版本说明: > Flink 版本:1.10 > Planner:old planner / blink planner > > > > 程序说明(Flink SQL): > > source:每隔一秒输出Tuple2.of(1, "{\"name\": \"a\"}"); > > > > > query:select a.id, a.name, a.name from (select id, body_json_to_map(name) > as name from data) a > > > > > sink:print > > > > > udf:body_json_to_map > > 实现如下 > > public Map<String, String> eval(String json) { > > logger.info("a"); > > return JsonUtil.fromJsonToMap(json); > > } > > > > > 运行结果: > > a > > a > > 1,{name=a},{name=a} > > a > > a > > 1,{name=a},{name=a} > > a > > a > > 1,{name=a},{name=a} > > > > > 问题: > > 子查询其实是为了使用body_json_to_map将 json 只解析一遍减少性能消耗而做的优化 > > 尝试使用了 old planner 和 blink planner 都是如上结果,查看执行计划,实际执行计划如下: > > > > > > > select > id, body_json_to_map(name), body_json_to_map(name) from data > > > > > 目前的解决方案: > > 做 group by 去把算子强行隔离开 > > > > > 想问下各位大佬这种 flink planner 做的优化有什么其他办法解决吗? > > > > > Best, > > Yichao Yang
