大数据算法题(flink spark sql)

1 求(event userid time)格式下不同event(比如浏览、点击、购买等行为)的pv uv。

//最普通的算法,数据倾斜,超慢,不合适
select count(userid) as pv, count(distinct userid) as uv from table group by event;


//先看错误的优化方法
with tablea as(
select str(event+random) as fixevent, count(userid) as pv1, count(distinct userid) as uv1 from table group by str(event+random)
)
select 
substr(fixevent,5) as event, 
sum(pv1) as pv, 
sum(uv1) as uv //错误!!两阶段聚合不适合计算distinct的uv情况。
from tablea
group by substr(fixevent,5);


//正确做法,第一步先形成(userid event num)的数据结构,num代表同一个userid触发了event多少次。
//并且第一次聚合大大减少了数据量,将相同的时间合并,统一用num来表示,过滤了很多数据。
with tablea as(
select event, userid, count(*) as num from table group by event, userid
)
slect count(*) as uv, sum(num) as pv from tablea group by event;

1.2 在flink纯实时计算pv uv 不分窗口

keyby(event+userid).flatmap(阶段1).keyby(event).flatmap(阶段2)

阶段1:
这里面存state,来一条累加一条,就是求上面的num
阶段2:
这里面存三个状态,分别是这个event下的pv,uv,mapstate(userid, num)
新来的(userid event num), 如果userid在mapstate(userid, num)里面,更新状态里对应的num,更新pv;
如果userid不在在mapstate(userid, num)里面,更新状态里对应的userid num,更新pv, uv;

1.3 flink小事窗口计算pv uv

keyby(event+userid).window().reduce(new ReduceFunction(阶段1)).keyby(event).window().process(new ProcessWindowFunction(阶段2))

阶段1:
增量计算(userid event num)
阶段2:
拿到全量数据(userid event num)计算pv, uv就可以;

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值