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
