请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。
电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段): market_act(营销活动): {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店} new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间} orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店} 需求:按活动统计活动期间新会员产生的订单金额 伪sql: select act_id,count(1) as order_num,sum(amt) as order_amt from orders t1 inner join new_member t2 on t1.member_id=t2.member_id inner join market_act t3 on t2.act_id=t3.act_id where t1.create_time between t3.start_time and t3.end_time ; 目前做法: 将 market_act 和 new_member 两个维表消息放到redis缓存, flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动, 是则输出{act_id,order_no,amt,member_id},然后sink到db。 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算? [hidden email] |
flink sql + zeppelin
[hidden email] <[hidden email]> 于2021年1月26日周二 上午11:30写道: > 请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。 > > 电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段): > market_act(营销活动): > {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店} > new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间} > > orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店} > > 需求:按活动统计活动期间新会员产生的订单金额 > 伪sql: > select act_id,count(1) as order_num,sum(amt) as order_amt > from orders t1 > inner join new_member t2 on t1.member_id=t2.member_id > inner join market_act t3 on t2.act_id=t3.act_id > where t1.create_time between t3.start_time and t3.end_time ; > > 目前做法: > 将 market_act 和 new_member 两个维表消息放到redis缓存, > flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动, > 是则输出{act_id,order_no,amt,member_id},然后sink到db。 > > 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算? > > > > [hidden email] > |
我们还没用到flink sql,有用流API实现的思路吗?
[hidden email] 发件人: yang nick 发送时间: 2021-01-26 11:32 收件人: user-zh 主题: Re: 多流join的场景如何优化 flink sql + zeppelin [hidden email] <[hidden email]> 于2021年1月26日周二 上午11:30写道: > 请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。 > > 电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段): > market_act(营销活动): > {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店} > new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间} > > orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店} > > 需求:按活动统计活动期间新会员产生的订单金额 > 伪sql: > select act_id,count(1) as order_num,sum(amt) as order_amt > from orders t1 > inner join new_member t2 on t1.member_id=t2.member_id > inner join market_act t3 on t2.act_id=t3.act_id > where t1.create_time between t3.start_time and t3.end_time ; > > 目前做法: > 将 market_act 和 new_member 两个维表消息放到redis缓存, > flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动, > 是则输出{act_id,order_no,amt,member_id},然后sink到db。 > > 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算? > > > > [hidden email] > |
两两join吧
[hidden email] <[hidden email]> 于2021年1月26日周二 下午2:28写道: > 我们还没用到flink sql,有用流API实现的思路吗? > > > > [hidden email] > > 发件人: yang nick > 发送时间: 2021-01-26 11:32 > 收件人: user-zh > 主题: Re: 多流join的场景如何优化 > flink sql + zeppelin > > [hidden email] <[hidden email]> 于2021年1月26日周二 上午11:30写道: > > > 请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。 > > > > 电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段): > > market_act(营销活动): > > {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店} > > new_member(新增会员): > {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间} > > > > > orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店} > > > > 需求:按活动统计活动期间新会员产生的订单金额 > > 伪sql: > > select act_id,count(1) as order_num,sum(amt) as order_amt > > from orders t1 > > inner join new_member t2 on t1.member_id=t2.member_id > > inner join market_act t3 on t2.act_id=t3.act_id > > where t1.create_time between t3.start_time and t3.end_time ; > > > > 目前做法: > > 将 market_act 和 new_member 两个维表消息放到redis缓存, > > flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动, > > 是则输出{act_id,order_no,amt,member_id},然后sink到db。 > > > > 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算? > > > > > > > > [hidden email] > > > |
In reply to this post by hl9902@126.com
双流join或者多流join从技术上是可以实现你这个场景的,网上有很多成熟的案例。
但是要考虑具体的业务需求,比如数据是否能在规定时间到达,未到达如何处理,如果因为多流join造成数据缺失或者延迟,对业务影响比较大的话还不如继续用维表。 在 2021-01-26 11:30:56,"[hidden email]" <[hidden email]> 写道: >请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。 > >电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段): >market_act(营销活动): {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店} >new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间} >orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店} > >需求:按活动统计活动期间新会员产生的订单金额 >伪sql: >select act_id,count(1) as order_num,sum(amt) as order_amt >from orders t1 >inner join new_member t2 on t1.member_id=t2.member_id >inner join market_act t3 on t2.act_id=t3.act_id >where t1.create_time between t3.start_time and t3.end_time ; > >目前做法: >将 market_act 和 new_member 两个维表消息放到redis缓存, >flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动, >是则输出{act_id,order_no,amt,member_id},然后sink到db。 > >我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算? > > > >[hidden email] |
Free forum by Nabble | Edit this page |