hive join操作
来源:互联网 发布:api接口文档 源码 编辑:程序博客网 时间:2024/05/17 08:11
1. 只支持相等JOIN。
2. 多表连接当使用不同的列进行JOIN时,会产生多个MR作业。
3. 最后的表的数据是从流中读取,而前面的会在内存中缓存,因此最好把最大的表放在最后。
SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)//暗示
4. JOIN在WHERE子句前进行处理。
SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)
WHERE a.ds='2009-07-07' AND b.ds='2009-07-07'
SELECT a.val, b.val FROM a LEFT OUTER JOIN b
ON (a.key=b.key AND b.ds='2009-07-07' AND a.ds='2009-07-07')//先过滤
5. JOIN是左结合的:
SELECT a.val1, a.val2, b.val, c.val
FROM a JOIN b ON (a.key = b.key) LEFT OUTER JOIN c ON (a.key = c.key)
---> FROM c LEFT OUTER JOIN a ON (c.key = a.key) LEFT OUTER JOIN b ON (c.key = b.key).
6. 只有一个大表时,可以使用map端连接:
SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a join b on a.key = b.key
1.将小表的数据变成hashtable广播到所有的map端,将大表的数据进行合理的切分
2. map阶段用大表的数据一行一行的去探测小表的hashtable
hive.auto.convert.join=true:自动判断大表和小表
hive.smalltable.filesize=25M:当超过时使用reduce端连接
hive.join.emit.interval=1000
// hive.mapjoin.size.key=10000
hive.mapjoin.cache.numrows=10000
7. BUCKET MAP JOIN:在JOIN列上分桶,桶的数目成倍数关系,设置hive.optimize.bucketmapjoin=true
SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a join b on a.key = b.key
Bucket Map Join 执行计划分两步,第一步先将小表做map 操作变成hashtable 然后广播到所有大表的map端,大表的map端接受了number_buckets 个小表的hashtable并不需要合成一个大的hashtable,直接可以进行map 操作,map 操作会产生number_buckets 个split,每个split 的标记跟小表的hashtable 标记是一样的, 在执行projection 操作的时候,只需要将小表的一个hashtable 放入内存即可,然后将大表的对应的split 拿出来进行判断,所以其内存限制为小表中最大的那个hashtable 的大小.
8. SORT-MERGE JOIN:在JOIN列上排序并分桶,且有相同的桶数目
set hive.input.format=org.apache.hadoop.hive.ql.io.BucketizedHiveInputFormat;
set hive.optimize.bucketmapjoin = true;
set hive.optimize.bucketmapjoin.sortedmerge = true;
9. SKEW JOIN:处理数据倾斜
hive.exec.reducers.bytes.per.reducer:默认处理1G数据
hive.optimize.skewjoin=false
hive.skewjoin.key=100000 :(处理的总记录数/reduce个数)的2-4倍
内连接:SELECT sales.*,things.* FROM sales JOIN things ON (sales.id=things.id)
SELECT sales.*,things.* FROM sales LEFT/RIGHT/FULL OUTER JOIN things ON (sales.id=things.id)
半连接: 右手边的表只能出现在JOIN条件里,不能出现在SELECT和WHERE里。
SELECT * FROM things LEFT SEMI JOIN sales ON (sales.id=things.id)
=SELECT * FROM things WHERE things.id in (SELECT id FROM sales)
- Hive join操作小结
- hive的join操作
- Hive join操作小结
- hive 中的join操作
- hive的join操作
- Hive join操作小结
- hive join操作
- hive中join操作
- Hive中的Join操作
- hive join操作总结
- MapReduce实现hive join操作
- hive 中的map join 操作
- hive中的子查询改join操作
- hive中的join的一些操作
- Hive中的join操作原理和优化
- Hive之——Join操作
- hive的6种join操作
- hive join
- 解决weblogic与系统时间相差8小时的问题
- 得到图片字节流 用bitmap显示出来
- eclipse中egit插件冲突处理
- ASP.NET 之CSS学习
- git使用情景1:正在写代码,突然线上出现了bug
- hive join操作
- 2016-12-13
- kubernetes基础入门之-安装部署配置示例
- hadoop mapreduce wordcount编写
- 【收藏学习笔记】使用supervisor提高node.js调试效率
- Handler基本使用(一) new Handler()和new Handler(Handler.Callback)
- MATLAB GPU编程基础
- NoHttp
- 常见的木马端口