hive中left join一对多时,关联顺序不固定

A left join B on A.a = B.b
当a与b是一对多时,也就是一条A=a关联多条B=b,关联时候顺序是随机的,

   a=1  B=1  xxx1
   a=1  B=1  xxxx2
   a=1  B=1  xxxxx3


也可能变成

   a=1  B=1  xxxx2
   a=1  B=1  xxx1
   a=1  B=1  xxxxx3


每次重跑其顺序不固定,可见left join的时候出现一对多时,关联顺序是随机的。

### Hive SQL Left Join 使用方法及实例 在Hive查询语言(HiveQL)中,`LEFT JOIN`用于返回左表中的所有记录以及右表中存在的匹配记录。如果右表中存在匹配,则结果集中相应的列包含NULL。 #### 基本语法结构 ```sql SELECT column_names FROM table1 t1 LEFT JOIN table2 t2 ON t1.common_column = t2.common_column; ``` 此操作会保留来自`t1`(左侧表格)的所有行,即使这些行在`t2`(右侧表格)里找到对应的键值配对[^2]。 #### 实际应用案例分析 考虑两个表:一个是用户信息表(`user`);另一个是页面浏览记录表(`page_view`)。假设想要获取特定日期访问过网站的所有用户的完整资料,即便某些用户当天并未产生任何浏览行为也应被列出: ```sql INSERT OVERWRITE TABLE pv_users SELECT u.* FROM user u LEFT SEMI JOIN page_view pv ON (pv.userid = u.id) WHERE pv.date = '2008-03-03'; ``` 上述命令通过`LEFT SEMI JOIN`实现了这一需求,它只选取那些能在右边表找到对应关系的左边表条目,并且过滤条件应用于连接后的数据集上。 对于更常规的情况——即仅限于存在关联的数据项——则可以直接采用普通的`LEFT JOIN`: ```sql SELECT a.s_id, a.s_name, COUNT(b.c_id), SUM(CASE WHEN b.s_score IS NULL THEN 0 ELSE b.s_score END) FROM student AS a LEFT JOIN score AS b ON a.s_id = b.s_id GROUP BY a.s_id, a.s_name; ``` 这段SQL展示了如何统计每位学生所修课程数量及其总分情况,即便是未参与评分的学生也会显示出来,其分数默认计为零[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值