Hive三大连接操作全解析

Hive中的连接操作详解

1. 全连接(FULL JOIN)
  • 作用:返回两个表的所有记录,匹配失败时用NULL填充缺失部分
  • 语法
    SELECT *
    FROM table1 
    FULL JOIN table2 
      ON table1.key = table2.key
    

  • 示例
    -- 员工表(emp)和部门表(dept)的全连接
    SELECT emp.name, dept.dept_name
    FROM emp 
    FULL JOIN dept 
      ON emp.dept_id = dept.id
    

  • 结果特征
    • 包含所有员工(即使无部门)
    • 包含所有部门(即使无员工)
    • 缺失值显示为NULL

2. 半连接(SEMI JOIN)
  • 作用:仅返回左表中存在于右表的记录(不返回右表字段)
  • 语法
    SELECT *
    FROM table1 
    LEFT SEMI JOIN table2 
      ON table1.key = table2.key
    

  • 示例
    -- 获取有订单的客户
    SELECT cust.*
    FROM customers cust 
    LEFT SEMI JOIN orders 
      ON cust.id = orders.cust_id
    

  • 结果特征
    • 只返回左表字段
    • 相当于WHERE EXISTS子查询
    • 右表字段不可访问

3. 交叉连接(CROSS JOIN)
  • 作用:生成两个表的笛卡尔积(所有行组合)
  • 语法
    SELECT *
    FROM table1 
    CROSS JOIN table2
    

  • 示例
    -- 生成所有产品与地区的组合
    SELECT products.name, regions.region_name
    FROM products 
    CROSS JOIN regions
    

  • 结果特征
    • 结果行数 = $m \times n$($m$为左表行数,$n$为右表行数)
    • 无连接条件
    • 大数据集需谨慎使用(易产生海量数据)

核心对比

连接类型匹配逻辑结果特征典型应用场景
FULL JOIN保留所有记录+NULL填充包含两表全部数据数据完整性分析
SEMI JOIN仅保留左表匹配记录只返回左表字段存在性验证(如过滤)
CROSS JOIN所有行组合(笛卡尔积)$m \times n$ 行结果组合生成(如测试用例构建)

性能提示

  • 优先使用SEMI JOIN替代IN/EXISTS子查询(Hive优化更好)
  • CROSS JOIN需严格控制数据量(可添加WHERE 1=0快速终止)
  • 大表连接建议开启MapJoin优化:SET hive.auto.convert.join=true;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值