hive的left join 陷阱

hive中,左连接操作不能在on的右边加不等式条件。比如在hive中不能进行如下操作:
select * from tabel_1 a left join table_2 b on a.id=b.id and a.salary>b.salary
会出现报错。有人给出的答案是把上面语句改成:
select * from tabel_1 a left join table_2 b on a.id=b.id where a.salary>b.salary
如此一来,将不再报错。但是,在进行统计的聚合统计的时候很容易出现错误,也就是漏掉数据。
比如,
select a.id,sum(a.sales),b.id from table_1 a left join table_2 b on a.id=b.id where a.salary>b.salary;
操作结果将把不满足a.salary>b.salary的记录删掉,只计算满足条件的sum(a.salary)。但是,如果你只想计算a表的总salary之和,那么上述操作会使得你的结果减小。
改进方法:尝试用sparksql运行,sparksql支持连接on的不等式条件。如果非要用hivesql,尝试判空操作而非过滤。只在on加等式条件,不等式的判断放在查询字段中。

### 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、付费专栏及课程。

余额充值