You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-zh@flink.apache.org by 1048262223 <10...@qq.com> on 2020/06/04 08:53:33 UTC

Flink SQL 子查询优化问题

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

Re: Flink SQL 子查询优化问题

Posted by godfrey he <go...@gmail.com>.
hi Yichao,

目前 planner 会 try best 的将两个相邻的 project 节点合并在一起,除非两个project被分开。
就像你上面的那种做法。但是加一个group by的执行代价比较高。
对于blink planner 而言,*有一个绕的办法*,可以在子查询的结果加一个print sink(可以ignore输出),
利用多sink的优化特性,将两个project分开,从而阻止优化器将两个project合并。

Best,
Godfrey



1048262223 <10...@qq.com> 于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