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 斗鱼 <12...@qq.com.INVALID> on 2024/10/22 02:37:55 UTC

回复: 关于如何根据参数条件动态生成join的关联的sql

大佬,感谢您的回复,你说的计算所有Join结果是指不走Lookup Join全部提前计算吗?还是什么意思?目前我们是无法提前预知所有结果的,这个外部的三张维度表是根据用户请求保存的,我需要用事实表的数据去Lookup Join这边维度表的数据才能获取到结果


目前我的思路是:想直接通过多个union将多个组合条件查询同时发起,但是会有too many connection的问题,


针对同时发起多个Lookup Join的时候的并发连接控制这个问题,不知道大佬们一般是怎么解决的?FlinkSQL如何配置连接池呢,有没有想过案例或demo呢?官网看了没有找到相关参数配置,大佬们,能不能麻烦帮忙指导下呢,期待能收到指导与回复,感谢



斗鱼
1227581167@qq.com



&nbsp;




------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <jinfeng1995@gmail.com&gt;;
发送时间:&nbsp;2024年10月21日(星期一) 晚上10:04
收件人:&nbsp;"user-zh"<user-zh@flink.apache.org&gt;;

主题:&nbsp;Re: 关于如何根据参数条件动态生成join的关联的sql



hi,


先计算所有的 join 结果,结果中把相关的 join 字段带上, 再去基于 join 的结果去选择需要的结果是否可以?



Best,

Feng



On Wed, Oct 16, 2024 at 10:42 AM 斗鱼 <1227581167@qq.com.invalid&gt; wrote:

&gt; 大佬们,目前我遇到一个业务场景的问题,
&gt; 有如下四张表,其中一张事实表tableFact和三张维度表tableDimA、tableDimDetailB、tableDimDetailC进行left
&gt; join关联,这四张表根据userId、actPkId、bId、cType、create_time这几个参数进行关联,三张维度表通过actPkId进行关联
&gt;
&gt; *目前需求是想实现根据维度表bId、cType、create_time这三个字段的数据的情况,动态转成对应join的SQL*,具体相关信息如下:
&gt;
&gt; *表结构大致信息:*
&gt;
&gt;&nbsp; tableFact(
&gt;&nbsp; userId String primary key,
&gt;&nbsp; create_time
&gt;&nbsp; )
&gt;
&gt;&nbsp; tableDimA
&gt;&nbsp; (
&gt;&nbsp; actPkId String primary key,
&gt;&nbsp; targetUserId String,
&gt;&nbsp; start_time datetime,
&gt;&nbsp; end_time datetime
&gt;
&gt;&nbsp; )
&gt;
&gt;&nbsp; tableDimDetailB
&gt;&nbsp; (
&gt;&nbsp; actPkId String primary key,
&gt;&nbsp; bId String
&gt;&nbsp; )
&gt;
&gt;&nbsp;&nbsp; tableDimDetailC
&gt;&nbsp; (
&gt;&nbsp; actPkId String primary key,
&gt;&nbsp; cType String
&gt;&nbsp; )
&gt;
&gt;&nbsp; *假定:*
&gt; A: fact.userlddimA.targetUserld
&gt; B: fact.bId == dimB.bId
&gt; C: fact.cType == dimA.cType
&gt; D: fact.create time &gt;= dimA.start time&nbsp; and fact.create time <= dimA.end
&gt; time
&gt;
&gt; *前置条件:*A必须存在,B、C、D可以组合存在,即B、C、D的所有可能组合条件存在,
&gt;
&gt; *举例如下参数情况:*
&gt; 如 (A B C)表示A、B、C的条件都存在的情况,组合出
&gt; SELECT *
&gt; FROM tableFact P
&gt; LEFT JOIN tableDimA FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS A ON P.userId =
&gt; A.targetUserId
&gt; LEFT JOIN tableDimDetailB FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS B ON
&gt; A.actPkId = B.actPkId AND P.bId=B.bId
&gt; LEFT JOIN tableDimDetailC FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS C ON
&gt; A.actPkId = C.actPkId AND P.cType=B.cType;
&gt;
&gt; 如 (A B C D)表示A、B、C D的条件都存在的情况,组合出如下查询语句
&gt; SELECT *
&gt; FROM tableFact P
&gt; LEFT JOIN tableDimA FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS A ON P.userId =
&gt; A.targetUserId
&gt; LEFT JOIN tableDimDetailB FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS B ON
&gt; A.actPkId = B.actPkId AND P.bId=B.bId
&gt; LEFT JOIN tableDimDetailC FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS C ON
&gt; A.actPkId = C.actPkId AND P.cType=B.cType
&gt;&nbsp; WHERE P.create_time BETWEEN A.start_time AND A.end_time;
&gt;
&gt; *表结构图信息*
&gt;
&gt;
&gt;
&gt;
&gt; 想请教下各位大佬,Flink或者有什么技术能实现这种动态多条件参数组合转成sql的实现方案吗?期待能收到各位大佬帮忙的指导回复,感谢
&gt;
&gt; ------------------------------
&gt; 斗鱼
&gt; 1227581167@qq.com
&gt;
&gt; <https://wx.mail.qq.com/home/index?t=readmail_businesscard_midpage&amp;nocheck=true&amp;name=%E6%96%97%E9%B1%BC&amp;icon=http%3A%2F%2Fthirdqq.qlogo.cn%2Fg%3Fb%3Dsdk%26k%3DYiaI7kvDORpPP1623Fzbtyg%26s%3D100%26t%3D525%3Frand%3D1641396237&amp;mail=1227581167%40qq.com&amp;code=&gt;
&gt;
&gt;

回复: 关于如何根据参数条件动态生成join的关联的sql

Posted by 斗鱼 <12...@qq.com.INVALID>.
大佬们,请教下,目前我测试了下,发现单个Lookup join所建立的连接数默认是按照并发度控制的,如果按照线程池大小设置的话,除非并发度设置成1,才有办法控制Lookup join的并发连接数,这块我需要重写哪些方法才有办法达成一个 taskManager 内的所有operator 能共享这些链接呢?由于源码这块不熟悉,麻烦帮忙指教下,或者有什么相关材料我能进一步学习自己掌握的,麻烦帮忙给点意见,期待能收到大佬的回复,感谢


斗鱼
1227581167@qq.com



&nbsp;




------------------&nbsp;原始邮件&nbsp;------------------
发件人:                                                                                                                        "user-zh"                                                                                    <jinfeng1995@gmail.com&gt;;
发送时间:&nbsp;2024年10月23日(星期三) 中午11:19
收件人:&nbsp;"user-zh"<user-zh@flink.apache.org&gt;;

主题:&nbsp;Re: 关于如何根据参数条件动态生成join的关联的sql



我表达的就是这个意思, 先把所有你需要的 join case 都计算出来, 并 union 所有结果,最后再根据条件选择需要的结果。

当前 Flink SQL 的 lookup join 大多数实现比如 jdbc 都是一个 join 节点一个 connection, 并没有做不同
join 节点的共享连接池。
你可能得需要改造下 jdbc&nbsp; connector 。 比如引入一个静态的共享连接池,至少可以做到一个 taskManager 内的所有
operator 能共享这些链接。


Best,
Feng


On Tue, Oct 22, 2024 at 10:38 AM 斗鱼 <1227581167@qq.com.invalid&gt; wrote:

&gt; 大佬,感谢您的回复,你说的计算所有Join结果是指不走Lookup
&gt; Join全部提前计算吗?还是什么意思?目前我们是无法提前预知所有结果的,这个外部的三张维度表是根据用户请求保存的,我需要用事实表的数据去Lookup
&gt; Join这边维度表的数据才能获取到结果
&gt;
&gt; 目前我的思路是:想直接通过多个union将多个组合条件查询同时发起,但是会有too many connection的问题,
&gt;
&gt; 针对同时发起多个Lookup
&gt; Join的时候的并发连接控制这个问题,不知道大佬们一般是怎么解决的?FlinkSQL如何配置连接池呢,有没有想过案例或demo呢?官网看了没有找到相关参数配置,大佬们,能不能麻烦帮忙指导下呢,期待能收到指导与回复,感谢
&gt; ------------------------------
&gt; 斗鱼
&gt; 1227581167@qq.com
&gt;
&gt; <https://wx.mail.qq.com/home/index?t=readmail_businesscard_midpage&amp;nocheck=true&amp;name=%E6%96%97%E9%B1%BC&amp;icon=http%3A%2F%2Fthirdqq.qlogo.cn%2Fg%3Fb%3Dsdk%26k%3DYiaI7kvDORpPP1623Fzbtyg%26s%3D100%26t%3D525%3Frand%3D1641396237&amp;mail=1227581167%40qq.com&amp;code=&gt;
&gt;
&gt;
&gt;
&gt; ------------------ 原始邮件 ------------------
&gt; *发件人:* "user-zh" <jinfeng1995@gmail.com&gt;;
&gt; *发送时间:* 2024年10月21日(星期一) 晚上10:04
&gt; *收件人:* "user-zh"<user-zh@flink.apache.org&gt;;
&gt; *主题:* Re: 关于如何根据参数条件动态生成join的关联的sql
&gt;
&gt; hi,
&gt;
&gt;
&gt; 先计算所有的 join 结果,结果中把相关的 join 字段带上, 再去基于 join 的结果去选择需要的结果是否可以?
&gt;
&gt;
&gt;
&gt; Best,
&gt;
&gt; Feng
&gt;
&gt;
&gt;
&gt; On Wed, Oct 16, 2024 at 10:42 AM 斗鱼 <1227581167@qq.com.invalid&gt; wrote:
&gt;
&gt; &gt; 大佬们,目前我遇到一个业务场景的问题,
&gt; &gt;
&gt; 有如下四张表,其中一张事实表tableFact和三张维度表tableDimA、tableDimDetailB、tableDimDetailC进行left
&gt; &gt;
&gt; join关联,这四张表根据userId、actPkId、bId、cType、create_time这几个参数进行关联,三张维度表通过actPkId进行关联
&gt; &gt;
&gt; &gt; *目前需求是想实现根据维度表bId、cType、create_time这三个字段的数据的情况,动态转成对应join的SQL*,具体相关信息如下:
&gt; &gt;
&gt; &gt; *表结构大致信息:*
&gt; &gt;
&gt; &gt;&nbsp; tableFact(
&gt; &gt;&nbsp; userId String primary key,
&gt; &gt;&nbsp; create_time
&gt; &gt;&nbsp; )
&gt; &gt;
&gt; &gt;&nbsp; tableDimA
&gt; &gt;&nbsp; (
&gt; &gt;&nbsp; actPkId String primary key,
&gt; &gt;&nbsp; targetUserId String,
&gt; &gt;&nbsp; start_time datetime,
&gt; &gt;&nbsp; end_time datetime
&gt; &gt;
&gt; &gt;&nbsp; )
&gt; &gt;
&gt; &gt;&nbsp; tableDimDetailB
&gt; &gt;&nbsp; (
&gt; &gt;&nbsp; actPkId String primary key,
&gt; &gt;&nbsp; bId String
&gt; &gt;&nbsp; )
&gt; &gt;
&gt; &gt;&nbsp;&nbsp; tableDimDetailC
&gt; &gt;&nbsp; (
&gt; &gt;&nbsp; actPkId String primary key,
&gt; &gt;&nbsp; cType String
&gt; &gt;&nbsp; )
&gt; &gt;
&gt; &gt;&nbsp; *假定:*
&gt; &gt; A: fact.userlddimA.targetUserld
&gt; &gt; B: fact.bId == dimB.bId
&gt; &gt; C: fact.cType == dimA.cType
&gt; &gt; D: fact.create time &gt;= dimA.start time&nbsp; and fact.create time <= dimA.end
&gt; &gt; time
&gt; &gt;
&gt; &gt; *前置条件:*A必须存在,B、C、D可以组合存在,即B、C、D的所有可能组合条件存在,
&gt; &gt;
&gt; &gt; *举例如下参数情况:*
&gt; &gt; 如 (A B C)表示A、B、C的条件都存在的情况,组合出
&gt; &gt; SELECT *
&gt; &gt; FROM tableFact P
&gt; &gt; LEFT JOIN tableDimA FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS A ON P.userId =
&gt; &gt; A.targetUserId
&gt; &gt; LEFT JOIN tableDimDetailB FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS B ON
&gt; &gt; A.actPkId = B.actPkId AND P.bId=B.bId
&gt; &gt; LEFT JOIN tableDimDetailC FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS C ON
&gt; &gt; A.actPkId = C.actPkId AND P.cType=B.cType;
&gt; &gt;
&gt; &gt; 如 (A B C D)表示A、B、C D的条件都存在的情况,组合出如下查询语句
&gt; &gt; SELECT *
&gt; &gt; FROM tableFact P
&gt; &gt; LEFT JOIN tableDimA FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS A ON P.userId =
&gt; &gt; A.targetUserId
&gt; &gt; LEFT JOIN tableDimDetailB FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS B ON
&gt; &gt; A.actPkId = B.actPkId AND P.bId=B.bId
&gt; &gt; LEFT JOIN tableDimDetailC FOR SYSTEM_TIME AS OF P.proctime&nbsp; AS C ON
&gt; &gt; A.actPkId = C.actPkId AND P.cType=B.cType
&gt; &gt;&nbsp; WHERE P.create_time BETWEEN A.start_time AND A.end_time;
&gt; &gt;
&gt; &gt; *表结构图信息*
&gt; &gt;
&gt; &gt;
&gt; &gt;
&gt; &gt;
&gt; &gt; 想请教下各位大佬,Flink或者有什么技术能实现这种动态多条件参数组合转成sql的实现方案吗?期待能收到各位大佬帮忙的指导回复,感谢
&gt; &gt;
&gt; &gt; ------------------------------
&gt; &gt; 斗鱼
&gt; &gt; 1227581167@qq.com
&gt; &gt;
&gt; &gt; <
&gt; https://wx.mail.qq.com/home/index?t=readmail_businesscard_midpage&amp;nocheck=true&amp;name=%E6%96%97%E9%B1%BC&amp;icon=http%3A%2F%2Fthirdqq.qlogo.cn%2Fg%3Fb%3Dsdk%26k%3DYiaI7kvDORpPP1623Fzbtyg%26s%3D100%26t%3D525%3Frand%3D1641396237&amp;mail=1227581167%40qq.com&amp;code=
&gt; &gt;
&gt; &gt;
&gt; &gt;
&gt;

Re: 关于如何根据参数条件动态生成join的关联的sql

Posted by Feng Jin <ji...@gmail.com>.
我表达的就是这个意思, 先把所有你需要的 join case 都计算出来, 并 union 所有结果,最后再根据条件选择需要的结果。

当前 Flink SQL 的 lookup join 大多数实现比如 jdbc 都是一个 join 节点一个 connection, 并没有做不同
join 节点的共享连接池。
你可能得需要改造下 jdbc  connector 。 比如引入一个静态的共享连接池,至少可以做到一个 taskManager 内的所有
operator 能共享这些链接。


Best,
Feng


On Tue, Oct 22, 2024 at 10:38 AM 斗鱼 <12...@qq.com.invalid> wrote:

> 大佬,感谢您的回复,你说的计算所有Join结果是指不走Lookup
> Join全部提前计算吗?还是什么意思?目前我们是无法提前预知所有结果的,这个外部的三张维度表是根据用户请求保存的,我需要用事实表的数据去Lookup
> Join这边维度表的数据才能获取到结果
>
> 目前我的思路是:想直接通过多个union将多个组合条件查询同时发起,但是会有too many connection的问题,
>
> 针对同时发起多个Lookup
> Join的时候的并发连接控制这个问题,不知道大佬们一般是怎么解决的?FlinkSQL如何配置连接池呢,有没有想过案例或demo呢?官网看了没有找到相关参数配置,大佬们,能不能麻烦帮忙指导下呢,期待能收到指导与回复,感谢
> ------------------------------
> 斗鱼
> 1227581167@qq.com
>
> <https://wx.mail.qq.com/home/index?t=readmail_businesscard_midpage&nocheck=true&name=%E6%96%97%E9%B1%BC&icon=http%3A%2F%2Fthirdqq.qlogo.cn%2Fg%3Fb%3Dsdk%26k%3DYiaI7kvDORpPP1623Fzbtyg%26s%3D100%26t%3D525%3Frand%3D1641396237&mail=1227581167%40qq.com&code=>
>
>
>
> ------------------ 原始邮件 ------------------
> *发件人:* "user-zh" <ji...@gmail.com>;
> *发送时间:* 2024年10月21日(星期一) 晚上10:04
> *收件人:* "user-zh"<us...@flink.apache.org>;
> *主题:* Re: 关于如何根据参数条件动态生成join的关联的sql
>
> hi,
>
>
> 先计算所有的 join 结果,结果中把相关的 join 字段带上, 再去基于 join 的结果去选择需要的结果是否可以?
>
>
>
> Best,
>
> Feng
>
>
>
> On Wed, Oct 16, 2024 at 10:42 AM 斗鱼 <12...@qq.com.invalid> wrote:
>
> > 大佬们,目前我遇到一个业务场景的问题,
> >
> 有如下四张表,其中一张事实表tableFact和三张维度表tableDimA、tableDimDetailB、tableDimDetailC进行left
> >
> join关联,这四张表根据userId、actPkId、bId、cType、create_time这几个参数进行关联,三张维度表通过actPkId进行关联
> >
> > *目前需求是想实现根据维度表bId、cType、create_time这三个字段的数据的情况,动态转成对应join的SQL*,具体相关信息如下:
> >
> > *表结构大致信息:*
> >
> >  tableFact(
> >  userId String primary key,
> >  create_time
> >  )
> >
> >  tableDimA
> >  (
> >  actPkId String primary key,
> >  targetUserId String,
> >  start_time datetime,
> >  end_time datetime
> >
> >  )
> >
> >  tableDimDetailB
> >  (
> >  actPkId String primary key,
> >  bId String
> >  )
> >
> >   tableDimDetailC
> >  (
> >  actPkId String primary key,
> >  cType String
> >  )
> >
> >  *假定:*
> > A: fact.userlddimA.targetUserld
> > B: fact.bId == dimB.bId
> > C: fact.cType == dimA.cType
> > D: fact.create time >= dimA.start time  and fact.create time <= dimA.end
> > time
> >
> > *前置条件:*A必须存在,B、C、D可以组合存在,即B、C、D的所有可能组合条件存在,
> >
> > *举例如下参数情况:*
> > 如 (A B C)表示A、B、C的条件都存在的情况,组合出
> > SELECT *
> > FROM tableFact P
> > LEFT JOIN tableDimA FOR SYSTEM_TIME AS OF P.proctime  AS A ON P.userId =
> > A.targetUserId
> > LEFT JOIN tableDimDetailB FOR SYSTEM_TIME AS OF P.proctime  AS B ON
> > A.actPkId = B.actPkId AND P.bId=B.bId
> > LEFT JOIN tableDimDetailC FOR SYSTEM_TIME AS OF P.proctime  AS C ON
> > A.actPkId = C.actPkId AND P.cType=B.cType;
> >
> > 如 (A B C D)表示A、B、C D的条件都存在的情况,组合出如下查询语句
> > SELECT *
> > FROM tableFact P
> > LEFT JOIN tableDimA FOR SYSTEM_TIME AS OF P.proctime  AS A ON P.userId =
> > A.targetUserId
> > LEFT JOIN tableDimDetailB FOR SYSTEM_TIME AS OF P.proctime  AS B ON
> > A.actPkId = B.actPkId AND P.bId=B.bId
> > LEFT JOIN tableDimDetailC FOR SYSTEM_TIME AS OF P.proctime  AS C ON
> > A.actPkId = C.actPkId AND P.cType=B.cType
> >  WHERE P.create_time BETWEEN A.start_time AND A.end_time;
> >
> > *表结构图信息*
> >
> >
> >
> >
> > 想请教下各位大佬,Flink或者有什么技术能实现这种动态多条件参数组合转成sql的实现方案吗?期待能收到各位大佬帮忙的指导回复,感谢
> >
> > ------------------------------
> > 斗鱼
> > 1227581167@qq.com
> >
> > <
> https://wx.mail.qq.com/home/index?t=readmail_businesscard_midpage&nocheck=true&name=%E6%96%97%E9%B1%BC&icon=http%3A%2F%2Fthirdqq.qlogo.cn%2Fg%3Fb%3Dsdk%26k%3DYiaI7kvDORpPP1623Fzbtyg%26s%3D100%26t%3D525%3Frand%3D1641396237&mail=1227581167%40qq.com&code=
> >
> >
> >
>