hi Yichao,

最好的解决方式是在code gen的时候支持表达式复用,后续会慢慢加上这些优化。

Best,
Godfrey

1048262223 <[email protected]> 于2020年6月4日周四 下午9:52写道:

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

回复