HiveSQL题——互相关注(共同好友)

0 问题描述

    社交软件上如何判断自己关注的博主是否也关注了自己呢?现在有一张表为fans(粉丝表),表中有两个字段from_user,to_user,如果两者一致代表from_user关注了to_user。

1 数据准备

create table if not exists table15
(
    from_user   string comment '关注用户',
    to_user     string comment '被关注用户',
   `timestamp`  string comment '关注时间'
)
    comment '关注表';
INSERT overwrite table fans
VALUES ("A","B","2022-11-28 12:12:12"),
       ("A","C","2022-11-28 12:12:13"),
       ("A","D","2022-11-28 12:12:14"),
       ("B","A","2022-11-28 12:12:15"),
       ("B","E","2022-11-28 12:12:16"),
       ("C","A","2022-11-28 12:12:17");

2 数据分析

   思路一:如果是互相关注,很容易想到表自关联,具体sql如下:

--方法1
    select
        tmp1.from_user,
        tmp1.to_user,
        if(tmp2.from_user is not null, '是', '否') as is_friend
    from fans tmp1
             left join fans tmp2
                       on tmp1.from_user = tmp2.to_user
                           and tmp1.to_user = tmp2.from_user;


 思路二:使用union all进行上下拼接

--方法2
    select
        u1,
        u2
    from (
             select
                 from_user u1,
                 to_user   u2
             from fans
             union all
             select
                 to_user   u1,
                 from_user u2
             from fans
         ) tmp1
    group by u1, u2
    having count(1) = 2;

     上述两个sql逻辑都可以实现需求,但是当用户量到了亿级别,关注关系到了百亿级别,join底层会走shuffle,查询效率就会很低

思路三:

select 
      from_user,
      to_user,
  ---开窗函数sum() over (partition by..)的窗口计算范围:根据关系feature分组,组内全局聚合
      if(sum(1) over (partition by feature) > 1, 1, 0) as is_friend
from 
(
  select 
       from_user,
       to_user,
       if(from_user > to_user, concat(to_user, from_user), concat(from_user, to_user)) as feature
   from fans 
)tmp1

3 小结

   当问题有多种解决方案时,尽可能选择最优解

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
H SQL是指在Hive数据库中使用SQL语句解决的实际问。以下是一些Hive SQL的分类汇总: 1. 基本查询:例如,从user_info表中查询所有用户的姓名和所在地,并按地点进行分组。 2. 条件查询:例如,从order表中查询购买金额大于100的订单信息。 3. 排序与限制:例如,从product表中按照销售额降序排列,并只显示前10个产品。 4. 聚合和分组:例如,计算每个地区的销售总额和平均销售额。 5. 连接查询:例如,从order表和user表中查询订单和用户信息,并根据用户ID进行连接。 6. 子查询:例如,查询购买金额最高的用户的详细信息。 7. 更新和删除:例如,更新user表中的用户信息或删除过期的订单数据。 8. 数据转换:例如,将一列数据按照指定的分隔符进行拼接。 Hive SQL通常涉及到数据查询、数据操作和数据转换等方面,需要熟悉Hive SQL语法和函数的使用。通过解决这些真,可以提高对Hive SQL的理解和应用能力,并在实际工作中更加熟练地使用Hive数据库。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [大厂面试汇总-HiveSQL篇(持续更行中……)](https://blog.csdn.net/thenowaiting/article/details/129471886)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Hive SQL行列转换](https://blog.csdn.net/yangyang222222222/article/details/114871793)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [通俗易懂的Hive升级版教程(含配套资料)](https://download.csdn.net/download/weixin_26779013/19666180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值