HiveSql面试题--通过分桶算法解决事件类型问题思路

45 篇文章 222 订阅

0 需求

表结构:

others user_id  customer_id。如下所示:

hive> select * from a;
OK
,,,    1    9
,,,    2    8
,,,    2    2
,,,    3    
,,,    4    7

当user_id = customer_id时候输出如下结果:

1 数据准备

create table a(
    others string,
    user_id string,
    customer_id string
);
insert into a(others,user_id,customer_id) values(",,,","1","9");
insert into a(others,user_id,customer_id) values(",,,","2","8");
insert into a(others,user_id,customer_id) values(",,,","2","2");
insert into a(others,user_id,customer_id) values(",,,","3","");
insert into a(others,user_id,customer_id) values(",,,","4","7");

2 需求实现

此需求如果懂分组重排序的原理:解此题很简单.分组重排序算法如下:

参考链接

SQL算法之分桶重排序算法应用2【HiveSql面试题8】_hive sql数据分桶算法-CSDN博客

SQL算法之分桶重排序算法应用1【HiveSql面试题7详解】_hivesql排序题-CSDN博客

SQL之分桶重排序算法应用3【按照发生某事件进行重新分组】--HiveSql面试题9_分桶 sql 题-CSDN博客

  • 算法如下:
  • 第一步:判定 当前行和上一行的第二列是否相等,如果不等置为1,相等为0,作为flag列(根据事件设置标签)
  • 第二步:累加 flag列,值作为分桶id。(累加标签,作为分桶id)
  • 第三步:按照累加的值(分桶id)分组。
  • 第四步:组内重排序

本题只需要分组即可

(1)根据事件设置标签,如果发生了事件则置为1

(2)根据对应条件累加标签值(此处的条件是用户id相同时候,标签值相同)作为分桶id

本题的SQL如下

select others
      ,user_id
      ,customer_id
      ,sum(case when user_id = customer_id then 1 else 0 end) over(PARTITION by user_id) as flg
from a

另一种做法如下:如果不用分桶算法,可以采用join形式进行匹配,具体做法如下

明显采用分桶的算法解决此题会更好一点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值