hive的join操作

hivejoin的三种形式

  • shuffle join:是hive中的普通的join方式,基于map/reduce实现,join的key通过shuffle汇集到相应的reduce里做join。这种join方式不考虑数据量和数据模型设计,比较耗费资源,是较慢的join策略。
  • map join,join时,将小表load到每个节点的内存中,和大表在该节点上的数据进行join,在map端完成join。其中的一个表必须为能完全加载到内存中。这种方式对大表只做单次扫描,速度较快。
  • sort-merge-bucket join(smb join):参与join的表必须都是bucket存储,而且大表的bucket数量需要是小表的2倍。这种join方式受益于相同的key预先是bucket到一起的,可以加快join的速度。但由于对表设计有太多限制,故不常用

hive的join连接

left join:

 select * from l_join a left join r_join b on (a.id=b.id) where b.id is not null;

cross join:笛卡尔积
left semi join:相当于sql的in操作,跟上on条件右表重复的记录不会出现
join:操作跟上on条件,右表重复的记录也会出现,
mapjoin:
在hive0.11,当表小于25m会默认自动启动该优化,hive.auto.convert.join=true

 select /*+mapjoin(a)*/ * from l_join a left join r_join b on (a.id=b.id);

注意
多表join是尽量把大表放在后面,因为回启动多个mapreduce,前面的结果会放到内存中。

### Hive Join 使用方法及示例 #### 一、Hive Join 基本概念 Hive 提供了 SQL 类似的查询语言来处理和分析大规模的数据集,支持多种数据连接操作Join)。这些操作允许用户从多个表中获取相关数据。理解 Hive Join 的原理与机制对于高效地进行数据分析和处理至关重要[^1]。 #### 二、Hive Join 类型及其语法结构 Hive 中常见的 Join 类型有 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN 和 FULL OUTER JOIN。每种类型的 Join 都有不同的作用范围: - **INNER JOIN**: 返回两个表中共有的记录。 ```sql SELECT a.*, b.* FROM table_a a INNER JOIN table_b b ON a.id = b.id; ``` - **LEFT OUTER JOIN (左外连接)**: 返回左边表中的所有记录,如果右边表中有匹配,则返回匹配的记录;如果没有匹配,则结果为 NULL。 ```sql SELECT a.*, b.* FROM table_a a LEFT OUTER JOIN table_b b ON a.id = b.id; ``` - **RIGHT OUTER JOIN (右外连接)**: 返回右边表中的所有记录,如果左边表中有匹配,则返回匹配的记录;如果没有匹配,则结果为 NULL。 ```sql SELECT a.*, b.* FROM table_a a RIGHT OUTER JOIN table_b b ON a.id = b.id; ``` - **FULL OUTER JOIN (全外连接)**: 只要其中一个表存在匹配,就返回行。当某一边没有匹配时,另一边的结果会填充NULL。 ```sql SELECT a.*, b.* FROM table_a a FULL OUTER JOIN table_b b ON a.id = b.id; ``` 除了上述标准 Join 外,还有特殊的 Map-side Join 或者称为 MapJoin,在某些情况下可以显著提高性能。MapJoin 将较小的一方加载到内存中完成整个过程而不需要 Reduce 过程,从而加快速度[^2]。 ```sql -- 启用 mapjoin 并指定小表作为map端缓存 SET hive.auto.convert.join=true; SELECT /*+ MAPJOIN(small_table) */ big_table.key, small_table.value FROM big_table JOIN small_table ON big_table.key = small_table.key; ``` #### 三、实际应用案例 假设有一个订单表 `orders` 和客户信息表 `customers`, 我们可以通过以下方式查询每个客户的总消费金额: ```sql SELECT c.customer_name, SUM(o.amount) FROM orders o JOIN customers c ON o.customer_id = c.customer_id GROUP BY c.customer_name; ``` 此查询首先通过 customer_id 字段将两张表格相连,接着计算每位顾客所下的订单总额并按姓名汇总显示出来[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值