hi Yichao, 最好的解决方式是在code gen的时候支持表达式复用,后续会慢慢加上这些优化。
Best, Godfrey 1048262223 <[email protected]> 于2020年6月4日周四 下午9:52写道: > Hi > > > 感谢答复,我明天使用下这种方式 > 社区也有同学提供了udf使用udtf代替的方法 > 我会尝试使用上述两种方式实现下 > > > 还有想问下之后有对这部分做优化的计划吗? > > > Best, > Yichao Yang > > > > > > ------------------ 原始邮件 ------------------ > 发件人: godfrey he <[email protected]> > 发送时间: 2020年6月4日 21:17 > 收件人: user-zh <[email protected]> > 主题: 回复:Flink SQL 子查询优化问题 > > > > 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&nbsp;/ 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&gt; eval(String json) { > > > > &nbsp; &nbsp; logger.info("a"); > > > > &nbsp; &nbsp; 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,&nbsp;body_json_to_map(name),&nbsp;body_json_to_map(name)&nbsp;from > data > > > > > > > > > > 目前的解决方案: > > > > 做 group by 去把算子强行隔离开 > > > > > > > > > > 想问下各位大佬这种 flink planner 做的优化有什么其他办法解决吗? > > > > > > > > > > Best, > > > > Yichao Yang
