Hive(二)hive表的关联

一、单表关联,还是前面的问题:

源数据:

 

    Tom Lucy  
    Tom Jack  
    Jone Lucy      
    Jone Jack  
    Lucy Mary  
    Lucy Ben  
    Jack Alice  
    Jack Jesse  
    Terry Alice  
    Terry Jesse  
    Philip Terry  
    Philip Alma  
    Mark Terry  
    Mark Alma  

这是一个child-parent表,第一列是child,第二列是parent。现在要求输出"grandchild--grandparent"表。

 

1.数据准备:

2.操作:即用到表的自身连接。

 

hive> insert overwrite local directory "/home/zt/bb.txt"
    > row format delimited fields terminated by ' '
    > select gl1.child,gl2.parent from gl gl1,gl gl2 where gl1.parent=gl2.child; 

现在打开本地/home/zt目录下的bb.txt文件夹(即使创建的是文件,也会被覆盖成文件夹),打开里面的文件:

 

 

Tom Mary
Jone Mary
Tom Ben
Jone Ben
Tom Alice
Jone Alice
Tom Jesse
Jone Jesse
Philip Alice
Mark Alice
Philip Jesse
Mark Jesse


二、多表关联:

 

见Hadoop MapReduce分类下的多表关联里面的工厂----地址问题。这个问题用hive解决就容易多了,简单到没有写的必要了。不过这里需要注意的是格式问题,尤其是建表时候的格式,按什么样的format能够把源数据导入表中。

 

 

 

### Hive 中大小 Join 的最佳实践 #### 优化 Join 性能的关键因素 为了提升 Hive 查询中大连接操作的效率,建议采用以下几种方法: - **启用 Map-side Join**:通过设置 `hive.auto.convert.join.noconditionaltask` 参数为 `true`,可以让 Hive 自动识别并转换适合的小到内存中的 Hash 来执行 map-side join。这通常会显著减少作业时间[^2]。 ```sql SET hive.auto.convert.join.noconditionaltask=true; ``` - **调整广播阈值**:默认情况下,只有当小小于一定字节时才会被自动加载至内存参与 map-side join。可以通过修改配置项 `hive.mapjoin.smalltable.filesize` 来控制这个临界值,默认是 25MB 左右。如果确认某个确实很小且频繁用于 join,则可适当降低此参数以便更积极地应用 map-side join 技术。 ```sql SET hive.mapjoin.smalltable.filesize=10485760; -- 设置为 10 MB ``` - **统计信息收集**:确保启用了列级别的统计数据采集功能 (`hive.stats.fetch.column.stats`) 原始数据量统计(`hive.stats.collect.rawdatasize`) ,这样可以帮助查询规划器更好地评估成本从而做出最优决策[^3]。 ```sql SET hive.stats.fetch.column.stats=true; SET hive.stats.collect.rawdatasize=true; ``` - **分区剪枝与分桶处理**:利用分区字段过滤掉不必要的输入文件;而针对较大的事实可以选择合适的低基数维度属性作为 bucketing key 进行预聚合,以此加速后续计算过程[^1]。 #### 实际案例分析 假设存在一张订单详情(order_details),其规模较大,并且有一张商品类别映射关系(product_categories),相对较小。此时要获取每种类别的销售总额,可以按照上述原则编写 SQL 如下所示: ```sql -- 前置准备:开启必要的性能调优选项 SET hive.auto.convert.join.noconditionaltask=true; SET hive.mapjoin.smalltable.filesize=10485760; SELECT pc.category_name, SUM(od.amount) AS total_sales FROM order_details od JOIN product_categories pc ON od.product_id = pc.product_id GROUP BY pc.category_name; ``` 在这个例子中,因为 `product_categories` 是个小,所以会被自动转化为 hash table,在 map 阶段完成 join 操作,进而提高了整体运行速度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w_t_y_y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值