当前位置:   article > 正文

大数据算法题(flink spark sql)_flinksql练习题

flinksql练习题

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

  1. //最普通的算法,数据倾斜,超慢,不合适
  2. select count(userid) as pv, count(distinct userid) as uv from table group by event;
  3. //先看错误的优化方法
  4. with tablea as(
  5. select str(event+random) as fixevent, count(userid) as pv1, count(distinct userid) as uv1 from table group by str(event+random)
  6. )
  7. select
  8. substr(fixevent,5) as event,
  9. sum(pv1) as pv,
  10. sum(uv1) as uv //错误!!两阶段聚合不适合计算distinct的uv情况。
  11. from tablea
  12. group by substr(fixevent,5);
  13. //正确做法,第一步先形成(userid event num)的数据结构,num代表同一个userid触发了event多少次。
  14. //并且第一次聚合大大减少了数据量,将相同的时间合并,统一用num来表示,过滤了很多数据。
  15. with tablea as(
  16. select event, userid, count(*) as num from table group by event, userid
  17. )
  18. 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就可以;

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/811542
推荐阅读
相关标签
  

闽ICP备14008679号