关于flink-sql 维表join问题

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

关于flink-sql 维表join问题

夜思流年梦
目前在准备搞实时数仓:碰到一个问题:
比如统计一个所有员工所有的业绩的报表,这个报表需要关联1个员工维表,4个业绩相关流表;
如果是正常SQL的话是这样join :


维表 left join  流表  1
left join 流表 2
left join 流表 3
left join 流表 4


因为flink-sql 的temporal join 不支持 维表在左边 left join 流表,


故只能 流表在左,维表在右来join  
即:select  * from  table a  left join dim_XXX  FOR SYSTEM_TIME AS OF a.proctime as c on a.memberId=c.rowkey


但是这个存在的问题是那些今天没有业绩的员工就没有统计数据,如果只是join一张流表,那么我可以把没有数据的员工在出报表时补空数据,现在的情况是要join4 张流表,那么必须得四张流表都有数据的员工才会有数据,这个就是问题了:最终的报表只有4个流表都有数据的员工。


上次问过一次,上次回答的是双流join,双流join的问题也是一样,只有两者都有数据才会得到最终结果,更何况是员工维表,基本上变化很少。因为有点找不到上次那个邮件了,所以再问一下,这种场景(维表在左 left join 流表)有没有比较好的解决方案







Reply | Threaded
Open this post in threaded view
|

Re: 关于flink-sql 维表join问题

Jark
Administrator
我觉得这个更像是一个周期性调度的批处理需求。因为你流处理,只能一直读取员工表的增量,没法每天读个全量。
是不是用 flink batch + 调度更好一点呢?

Best,
Jark

On Tue, 27 Oct 2020 at 16:08, 夜思流年梦 <[hidden email]> wrote:

> 目前在准备搞实时数仓:碰到一个问题:
> 比如统计一个所有员工所有的业绩的报表,这个报表需要关联1个员工维表,4个业绩相关流表;
> 如果是正常SQL的话是这样join :
>
>
> 维表 left join  流表  1
> left join 流表 2
> left join 流表 3
> left join 流表 4
>
>
> 因为flink-sql 的temporal join 不支持 维表在左边 left join 流表,
>
>
> 故只能 流表在左,维表在右来join
> 即:select  * from  table a  left join dim_XXX  FOR SYSTEM_TIME AS OF
> a.proctime as c on a.memberId=c.rowkey
>
>
> 但是这个存在的问题是那些今天没有业绩的员工就没有统计数据,如果只是join一张流表,那么我可以把没有数据的员工在出报表时补空数据,现在的情况是要join4
> 张流表,那么必须得四张流表都有数据的员工才会有数据,这个就是问题了:最终的报表只有4个流表都有数据的员工。
>
>
> 上次问过一次,上次回答的是双流join,双流join的问题也是一样,只有两者都有数据才会得到最终结果,更何况是员工维表,基本上变化很少。因为有点找不到上次那个邮件了,所以再问一下,这种场景(维表在左
> left join 流表)有没有比较好的解决方案
>
>
>
>
>
>
>
>
Reply | Threaded
Open this post in threaded view
|

Re:Re: 关于flink-sql 维表join问题

夜思流年梦
批处理的确是可以解决这类问题,只不过不是实时的了,主要是想使用flink-sql解决这类报表问题;
另外问一句, flink-sql 有打算解决这类问题吗?我感觉这个场景还挺多的呢
维表 left join 一张流表, 维表全量数据关联流表,既能获取到实时流表的统计数据,又能保证维表的数据是一个实时更新(或者定期更新)的状态

















在 2020-10-27 17:24:05,"Jark Wu" <[hidden email]> 写道:

>我觉得这个更像是一个周期性调度的批处理需求。因为你流处理,只能一直读取员工表的增量,没法每天读个全量。
>是不是用 flink batch + 调度更好一点呢?
>
>Best,
>Jark
>
>On Tue, 27 Oct 2020 at 16:08, 夜思流年梦 <[hidden email]> wrote:
>
>> 目前在准备搞实时数仓:碰到一个问题:
>> 比如统计一个所有员工所有的业绩的报表,这个报表需要关联1个员工维表,4个业绩相关流表;
>> 如果是正常SQL的话是这样join :
>>
>>
>> 维表 left join  流表  1
>> left join 流表 2
>> left join 流表 3
>> left join 流表 4
>>
>>
>> 因为flink-sql 的temporal join 不支持 维表在左边 left join 流表,
>>
>>
>> 故只能 流表在左,维表在右来join
>> 即:select  * from  table a  left join dim_XXX  FOR SYSTEM_TIME AS OF
>> a.proctime as c on a.memberId=c.rowkey
>>
>>
>> 但是这个存在的问题是那些今天没有业绩的员工就没有统计数据,如果只是join一张流表,那么我可以把没有数据的员工在出报表时补空数据,现在的情况是要join4
>> 张流表,那么必须得四张流表都有数据的员工才会有数据,这个就是问题了:最终的报表只有4个流表都有数据的员工。
>>
>>
>> 上次问过一次,上次回答的是双流join,双流join的问题也是一样,只有两者都有数据才会得到最终结果,更何况是员工维表,基本上变化很少。因为有点找不到上次那个邮件了,所以再问一下,这种场景(维表在左
>> left join 流表)有没有比较好的解决方案
>>
>>
>>
>>
>>
>>
>>
>>
Reply | Threaded
Open this post in threaded view
|

Re: Re: 关于flink-sql 维表join问题

Jark
Administrator
因为我理解你是想一天一个全量用户绩效结果表,不覆盖前一天的绩效结果,在我看来这就是批的需求了,因为需要重新读取 source
数据,而这从需求上就是有一天的 delay。

如果你能接受覆盖之前的绩效,那么可能可以使用 mysql-cdc connector 去获取 users 的全量+增量流式 source。
比如  mysql_cdc_users 就是去读取 mysql 中的 users 表,然后可以 left join 上绩效流等等,覆盖更新用户的绩效。

insert into mysql_users_latest_kpi
select * from mysql_cdc_users AS u left join kpi_stream AS k on u.memberId
= k.rowkey

mysql_users_latest_kpi 中就会存储最新的用户绩效,且不断在覆盖更新(一旦有新的绩效到达)。

Best,
Jark




On Wed, 28 Oct 2020 at 14:45, 夜思流年梦 <[hidden email]> wrote:

> 批处理的确是可以解决这类问题,只不过不是实时的了,主要是想使用flink-sql解决这类报表问题;
> 另外问一句, flink-sql 有打算解决这类问题吗?我感觉这个场景还挺多的呢
> 维表 left join 一张流表, 维表全量数据关联流表,既能获取到实时流表的统计数据,又能保证维表的数据是一个实时更新(或者定期更新)的状态
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 在 2020-10-27 17:24:05,"Jark Wu" <[hidden email]> 写道:
> >我觉得这个更像是一个周期性调度的批处理需求。因为你流处理,只能一直读取员工表的增量,没法每天读个全量。
> >是不是用 flink batch + 调度更好一点呢?
> >
> >Best,
> >Jark
> >
> >On Tue, 27 Oct 2020 at 16:08, 夜思流年梦 <[hidden email]> wrote:
> >
> >> 目前在准备搞实时数仓:碰到一个问题:
> >> 比如统计一个所有员工所有的业绩的报表,这个报表需要关联1个员工维表,4个业绩相关流表;
> >> 如果是正常SQL的话是这样join :
> >>
> >>
> >> 维表 left join  流表  1
> >> left join 流表 2
> >> left join 流表 3
> >> left join 流表 4
> >>
> >>
> >> 因为flink-sql 的temporal join 不支持 维表在左边 left join 流表,
> >>
> >>
> >> 故只能 流表在左,维表在右来join
> >> 即:select  * from  table a  left join dim_XXX  FOR SYSTEM_TIME AS OF
> >> a.proctime as c on a.memberId=c.rowkey
> >>
> >>
> >>
> 但是这个存在的问题是那些今天没有业绩的员工就没有统计数据,如果只是join一张流表,那么我可以把没有数据的员工在出报表时补空数据,现在的情况是要join4
> >> 张流表,那么必须得四张流表都有数据的员工才会有数据,这个就是问题了:最终的报表只有4个流表都有数据的员工。
> >>
> >>
> >>
> 上次问过一次,上次回答的是双流join,双流join的问题也是一样,只有两者都有数据才会得到最终结果,更何况是员工维表,基本上变化很少。因为有点找不到上次那个邮件了,所以再问一下,这种场景(维表在左
> >> left join 流表)有没有比较好的解决方案
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
>
Reply | Threaded
Open this post in threaded view
|

回复: Re: 关于flink-sql 维表join问题

史 正超
我最近的写的业务和你差不多,不过我关联的是两张表,一张mysql的维表,一张binlog的流表。最开始我都是left join ,发现只有binlog流表有数据时才计算。
后面 我做嵌套的查询,先与mysql维表inner join(直接join),然后再套一层query 再与流表left join,现在情况正常。就算binlog的流表没有数据也有计算到。
________________________________
发件人: Jark Wu <[hidden email]>
发送时间: 2020年10月28日 7:24
收件人: user-zh <[hidden email]>
主题: Re: Re: 关于flink-sql 维表join问题

因为我理解你是想一天一个全量用户绩效结果表,不覆盖前一天的绩效结果,在我看来这就是批的需求了,因为需要重新读取 source
数据,而这从需求上就是有一天的 delay。

如果你能接受覆盖之前的绩效,那么可能可以使用 mysql-cdc connector 去获取 users 的全量+增量流式 source。
比如  mysql_cdc_users 就是去读取 mysql 中的 users 表,然后可以 left join 上绩效流等等,覆盖更新用户的绩效。

insert into mysql_users_latest_kpi
select * from mysql_cdc_users AS u left join kpi_stream AS k on u.memberId
= k.rowkey

mysql_users_latest_kpi 中就会存储最新的用户绩效,且不断在覆盖更新(一旦有新的绩效到达)。

Best,
Jark




On Wed, 28 Oct 2020 at 14:45, 夜思流年梦 <[hidden email]> wrote:

> 批处理的确是可以解决这类问题,只不过不是实时的了,主要是想使用flink-sql解决这类报表问题;
> 另外问一句, flink-sql 有打算解决这类问题吗?我感觉这个场景还挺多的呢
> 维表 left join 一张流表, 维表全量数据关联流表,既能获取到实时流表的统计数据,又能保证维表的数据是一个实时更新(或者定期更新)的状态
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 在 2020-10-27 17:24:05,"Jark Wu" <[hidden email]> 写道:
> >我觉得这个更像是一个周期性调度的批处理需求。因为你流处理,只能一直读取员工表的增量,没法每天读个全量。
> >是不是用 flink batch + 调度更好一点呢?
> >
> >Best,
> >Jark
> >
> >On Tue, 27 Oct 2020 at 16:08, 夜思流年梦 <[hidden email]> wrote:
> >
> >> 目前在准备搞实时数仓:碰到一个问题:
> >> 比如统计一个所有员工所有的业绩的报表,这个报表需要关联1个员工维表,4个业绩相关流表;
> >> 如果是正常SQL的话是这样join :
> >>
> >>
> >> 维表 left join  流表  1
> >> left join 流表 2
> >> left join 流表 3
> >> left join 流表 4
> >>
> >>
> >> 因为flink-sql 的temporal join 不支持 维表在左边 left join 流表,
> >>
> >>
> >> 故只能 流表在左,维表在右来join
> >> 即:select  * from  table a  left join dim_XXX  FOR SYSTEM_TIME AS OF
> >> a.proctime as c on a.memberId=c.rowkey
> >>
> >>
> >>
> 但是这个存在的问题是那些今天没有业绩的员工就没有统计数据,如果只是join一张流表,那么我可以把没有数据的员工在出报表时补空数据,现在的情况是要join4
> >> 张流表,那么必须得四张流表都有数据的员工才会有数据,这个就是问题了:最终的报表只有4个流表都有数据的员工。
> >>
> >>
> >>
> 上次问过一次,上次回答的是双流join,双流join的问题也是一样,只有两者都有数据才会得到最终结果,更何况是员工维表,基本上变化很少。因为有点找不到上次那个邮件了,所以再问一下,这种场景(维表在左
> >> left join 流表)有没有比较好的解决方案
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
>