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

回复