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 JianWen Huang <ji...@gmail.com> on 2022/03/21 06:01:29 UTC
维度表变化,关联结果全部更新在Flink SQL该如何实现
事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
例子:
变化前:
A流:
name gender
a male
b male
c female
纬度表B:
name age
a 16
b 17
结果:
name gender age
a male 16
b male 17
发生变化后:
纬度表B:
name age
a 16->17
b 17->18
结果:
name gender age
a male 17
b male 18
目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗
Re:Re: Re: 维度表变化,关联结果全部更新在Flink SQL该如何实现
Posted by RS <ti...@163.com>.
Hi,
你这个例子中,捕获到B的变更CDC,若最终结果表支持部分字段更新,就直接更新结果表就行,都不需要关联,
只要你的B的CDC处理 晚于 A流的join处理就行
如果一定要全部关联的话,ttl又不可行,那你这个数据量会无限增大,后面就无法关联了的,设计肯定得改
在 2022-03-22 09:01:30,"JianWen Huang" <ji...@gmail.com> 写道:
>是的。其实我想到的也是将维度表和事实表都通过Cdc方式做成流,然后regular
>join,实现这样的需求好像只能把双流数据都得存到状态里才可以实现,但是状态会不断增大且业务上不能接受数据不准确的结果,配ttl又不可行。所以来请教大家有没有碰到过这种场景。
>
>casel.chen <ca...@126.com> 于2022年3月22日周二 08:43写道:
>>
>> 用cdc join也需要将事实表缓存下来才能实现吧,这就是普通的regular join,优点是双流驱动,缺点是需要缓存两边的数据,状态会变得很大,建议使用带ssd的rocksdb增量状态后端。
>> 业务上如果可以接受超过一定时间范围不用关联的话,还可以设置state ttl 进一步使状态大小可控。
>>
>>
>>
>>
>>
>>
>>
>> 在 2022-03-21 17:00:31,"zns" <86...@qq.com.INVALID> 写道:
>> >Cdc join
>> >
>> >> 2022年3月21日 14:01,JianWen Huang <ji...@gmail.com> 写道:
>> >>
>> >> 事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
>> >> 例子:
>> >> 变化前:
>> >> A流:
>> >> name gender
>> >> a male
>> >> b male
>> >> c female
>> >>
>> >> 纬度表B:
>> >> name age
>> >> a 16
>> >> b 17
>> >>
>> >> 结果:
>> >> name gender age
>> >> a male 16
>> >> b male 17
>> >>
>> >> 发生变化后:
>> >> 纬度表B:
>> >> name age
>> >> a 16->17
>> >> b 17->18
>> >>
>> >> 结果:
>> >> name gender age
>> >> a male 17
>> >> b male 18
>> >>
>> >> 目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗
Re: Re: 维度表变化,关联结果全部更新在Flink SQL该如何实现
Posted by JianWen Huang <ji...@gmail.com>.
是的。其实我想到的也是将维度表和事实表都通过Cdc方式做成流,然后regular
join,实现这样的需求好像只能把双流数据都得存到状态里才可以实现,但是状态会不断增大且业务上不能接受数据不准确的结果,配ttl又不可行。所以来请教大家有没有碰到过这种场景。
casel.chen <ca...@126.com> 于2022年3月22日周二 08:43写道:
>
> 用cdc join也需要将事实表缓存下来才能实现吧,这就是普通的regular join,优点是双流驱动,缺点是需要缓存两边的数据,状态会变得很大,建议使用带ssd的rocksdb增量状态后端。
> 业务上如果可以接受超过一定时间范围不用关联的话,还可以设置state ttl 进一步使状态大小可控。
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> 在 2022-03-21 17:00:31,"zns" <86...@qq.com.INVALID> 写道:
> >Cdc join
> >
> >> 2022年3月21日 14:01,JianWen Huang <ji...@gmail.com> 写道:
> >>
> >> 事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
> >> 例子:
> >> 变化前:
> >> A流:
> >> name gender
> >> a male
> >> b male
> >> c female
> >>
> >> 纬度表B:
> >> name age
> >> a 16
> >> b 17
> >>
> >> 结果:
> >> name gender age
> >> a male 16
> >> b male 17
> >>
> >> 发生变化后:
> >> 纬度表B:
> >> name age
> >> a 16->17
> >> b 17->18
> >>
> >> 结果:
> >> name gender age
> >> a male 17
> >> b male 18
> >>
> >> 目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗
Re:Re: 维度表变化,关联结果全部更新在Flink SQL该如何实现
Posted by "casel.chen" <ca...@126.com>.
用cdc join也需要将事实表缓存下来才能实现吧,这就是普通的regular join,优点是双流驱动,缺点是需要缓存两边的数据,状态会变得很大,建议使用带ssd的rocksdb增量状态后端。
业务上如果可以接受超过一定时间范围不用关联的话,还可以设置state ttl 进一步使状态大小可控。
在 2022-03-21 17:00:31,"zns" <86...@qq.com.INVALID> 写道:
>Cdc join
>
>> 2022年3月21日 14:01,JianWen Huang <ji...@gmail.com> 写道:
>>
>> 事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
>> 例子:
>> 变化前:
>> A流:
>> name gender
>> a male
>> b male
>> c female
>>
>> 纬度表B:
>> name age
>> a 16
>> b 17
>>
>> 结果:
>> name gender age
>> a male 16
>> b male 17
>>
>> 发生变化后:
>> 纬度表B:
>> name age
>> a 16->17
>> b 17->18
>>
>> 结果:
>> name gender age
>> a male 17
>> b male 18
>>
>> 目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗
Re: 维度表变化,关联结果全部更新在Flink SQL该如何实现
Posted by wushijjian5 <ws...@163.com>.
1. 两个流的数据分别存入hbase;
2. 然后起新的消费者,两条流做outer join , 并设置一定时间的TTL:
A, 能关联上直接输出
B, 右流为空,左流关联hbase补充右流数据
C, 左流为空,右流关联hbase补充左流数据
3, 全局数据根据一个version或ts可以排序去重
> 2022年3月22日 17:07,Michael Ran <gr...@163.com> 写道:
>
> 可以考虑存储层 局部更新
> 在 2022-03-21 17:00:31,"zns" <86...@qq.com.INVALID> 写道:
>> Cdc join
>>
>>> 2022年3月21日 14:01,JianWen Huang <ji...@gmail.com> 写道:
>>>
>>> 事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
>>> 例子:
>>> 变化前:
>>> A流:
>>> name gender
>>> a male
>>> b male
>>> c female
>>>
>>> 纬度表B:
>>> name age
>>> a 16
>>> b 17
>>>
>>> 结果:
>>> name gender age
>>> a male 16
>>> b male 17
>>>
>>> 发生变化后:
>>> 纬度表B:
>>> name age
>>> a 16->17
>>> b 17->18
>>>
>>> 结果:
>>> name gender age
>>> a male 17
>>> b male 18
>>>
>>> 目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗
Re:Re: 维度表变化,关联结果全部更新在Flink SQL该如何实现
Posted by Michael Ran <gr...@163.com>.
可以考虑存储层 局部更新
在 2022-03-21 17:00:31,"zns" <86...@qq.com.INVALID> 写道:
>Cdc join
>
>> 2022年3月21日 14:01,JianWen Huang <ji...@gmail.com> 写道:
>>
>> 事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
>> 例子:
>> 变化前:
>> A流:
>> name gender
>> a male
>> b male
>> c female
>>
>> 纬度表B:
>> name age
>> a 16
>> b 17
>>
>> 结果:
>> name gender age
>> a male 16
>> b male 17
>>
>> 发生变化后:
>> 纬度表B:
>> name age
>> a 16->17
>> b 17->18
>>
>> 结果:
>> name gender age
>> a male 17
>> b male 18
>>
>> 目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗
Re: 维度表变化,关联结果全部更新在Flink SQL该如何实现
Posted by zns <86...@qq.com.INVALID>.
Cdc join
> 2022年3月21日 14:01,JianWen Huang <ji...@gmail.com> 写道:
>
> 事实表流A需关联维度表B做数据打宽。需求是当纬度表B发生变化时,关联结果需全部发生变化更新到最新。
> 例子:
> 变化前:
> A流:
> name gender
> a male
> b male
> c female
>
> 纬度表B:
> name age
> a 16
> b 17
>
> 结果:
> name gender age
> a male 16
> b male 17
>
> 发生变化后:
> 纬度表B:
> name age
> a 16->17
> b 17->18
>
> 结果:
> name gender age
> a male 17
> b male 18
>
> 目前我想到一个做法是将维度表做成流然后关联事实表,最后根据更新时间取top1最新sink到存储里。请问大家有别的更好做法吗