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 / 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> eval(String json) {
logger.info("a");
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, body_json_to_map(name), body_json_to_map(name) 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 / 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> eval(String json) {
>
> logger.info("a");
>
> 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, body_json_to_map(name), body_json_to_map(name) from data
>
>
>
>
> 目前的解决方案:
>
> 做 group by 去把算子强行隔离开
>
>
>
>
> 想问下各位大佬这种 flink planner 做的优化有什么其他办法解决吗?
>
>
>
>
> Best,
>
> Yichao Yang