`
tobyqiu
  • 浏览: 39273 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hive 的join

 
阅读更多

直接就总结了

 

1. join 中不能包含不等的操作( 大于,小于,不等)

 

select * from a 
inner join b
on a.a>b.a

2.Join 中也不能有 OR 这种谓词

 

3.小表在前,大表在后

4.但是也可以颠倒,但是要用 STREAMTABLE来指定那个是大表

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)

5.join比where的优先级高,

 

-- post-filtered
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'


-- pre-filtered
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.hive 会把多表join中用到相同key的SQL合并成一个MR

 

--会合并成一个MR
SELECT a.val, b.val, c.val 
FROM a JOIN b ON (a.key = b.key1) 
JOIN c ON (c.key = b.key1)

--不会合并
SELECT a.val, b.val, c.val 
FROM a JOIN b ON (a.key = b.key1) 
JOIN c ON (c.key = b.key2)
--结合第四点,a是大表,所以会把b,c放进reducers的内存中,然后和 a join
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)

 

6.NOT IN,IN 这种语句hive 中不能执行,改用 LEFT SEMI JOIN

 

---不合法的
SELECT a.key, a.value
FROM a
WHERE a.key in
 (SELECT b.key
  FROM B);


--应该这么写
--但是b的列不能出现在select 中
SELECT a.key, a.val
FROM a 
LEFT SEMI JOIN b on (a.key = b.key)

7.很小的表可以放进内存,就用MapJoin 但是会有很多的限制.不是加了hint 就能用的

  • Mapjoin 的SQL 只有map 没有reduce 和 STREAMTABLE 是有本质区别的
--MapJoin 只有map端 所以所有的reduce端做的操作都是不能做的
--如 Group By/Join/Sort By/Cluster By/Distribute By

--摘录官方blogs
--The following is not supported.
--Union Followed by a MapJoin
--Lateral View Followed by a MapJoin
--Reduce Sink (Group By/Join/Sort By/Cluster By/Distribute By) Followed by MapJoin
--MapJoin Followed by Union
--MapJoin Followed by Join
--MapJoin Followed by MapJoin

SELECT /*+ MAPJOIN(b) */ a.key, a.value
FROM a join b on a.key = b.key

------------------------------------------------------------分割线
-- /*+ MAPJOIN(b) */  指定的是小表 (b) 
-- /*+ STREAMTABLE(a) */ 指定的是大表 (a)

SELECT /*+ STREAMTABLE(a) */ a.val, b.val
FROM a JOIN b ON (a.key = b.key1) 
  •  如果不使用hint在0.7版本以后,可以使用  hive.auto.convert.join 属性
--0.11默认是false,0.12默认变成了true
set  hive.auto.convert.join =ture;
--默认是25m 单位是字节
set hive.,mapjoin.smalltable.filesize=25000000
  •  在多个mapjoin上使用不同的key
select /*+MAPJOIN(smallTableTwo)*/ 
idOne, idTwo, value 
FROM
  ( select /*+MAPJOIN(smallTableOne)*/ idOne, idTwo, value FROM
    bigTable JOIN smallTableOne on (bigTable.idOne = smallTableOne.idOne)          )firstjoin                                                            
  JOIN                                                                 
  smallTableTwo on (firstjoin.idTwo = smallTableTwo.idTwo)

--上面的SQL不能变成一个map job
--如果不用Hint,这个SQL 会被当做2个map-only的job执行
--如果用户事先知道,输入是足够小,适合在内存中,以下配置参数用来确保查询在单个map-reduce job中执行
--hive.auto.convert.join.noconditionaltask 就是个开关
--hive.auto.convert.join.noconditionaltask.size 表的大小小于这个size直接变成mapjoin,默认是10m
  •  Mapjoin的步骤

 

Local work:

--read records via standard table scan (including filters and projections) from source on local machine

--build hashtable in memory

--write hashtable to local disk

--upload hashtable to dfs

--add hashtable to distributed cache

Map task

--read hashtable from local disk (distributed cache) into memory

--match records' keys against hashtable

--combine matches and write to output

No reduce task

 

MapJoin总结下

a)一个mapjoin只能处理一次一个key,它可以执行的多表连接,但只有当所有的表都加入了相同的key。(典型的星型连接不属于这一类,但是上面不支持的例子就是属于这一类)

b)就算加了hint也未必,真的是用mapjoin

c)一连串的mapjoins不会合并成一个单一的map job,除非查询写成一个级联的mapjoin(mapjoin(table, subquery(mapjoin(table, subquery....).自动转换后的也不会变成一个单一的map job。还是上面这个例子,打开了所有的开关,会把SQL 变成2个单一的map-only job 来跑

d)mapjoin 中用到的哈希表,每个子QUERY运行都会生成,先下载,再分发给map

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    使用Hive进行join查询的时报错

    NULL 博文链接:https://weigang-gao.iteye.com/blog/2260663

    分布式数据仓库Hive大全

    4. Hive Join 29 5. HIVE参数设置 31 6. HIVE UDF 33 6.1 基本函数 33 6.1.1 关系操作符 33 6.1.2 代数操作符 34 6.1.3 逻辑操作符 35 6.1.4 复杂类型操作符 35 6.1.5 内建函数 36 6.1.6 数学函数 36 6.1.7 集合函数...

    Hive用户指南

    4. Hive Join 29 5. HIVE参数设置 31 6. HIVE UDF 33 6.1 基本函数 33 6.1.1 关系操作符 33 6.1.2 代数操作符 34 6.1.3 逻辑操作符 35 6.1.4 复杂类型操作符 35 6.1.5 内建函数 36 6.1.6 数学函数 36 6.1.7 集合函数...

    Hive Summit 2011-join

    facebook hive中的各种join策略的slides,reporter是个Chinese。

    Hive on Spark EXPLAIN statement

    Hive on Spark EXPLAIN statement : 讲述了 Common Join / Map join / Bucket Map Join / Sorted Merge Bucket Map Join / skew join 在explain 中的 树结构 。In Hive, command EXPLAIN can be used to show the ...

    hive sql + left join 数据缺失

    hive sql + left join 数据缺失

    利用Hive进行复杂用户行为大数据分析及优化案例

    利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件...14_Hive中的数据倾斜及解决方案-三种join方式 15_Hive中的数据倾斜及解决方案-group by 16_Hive中使用正则加载数据 17_Hive中使用Python脚本进行预处理

    Hive-Summit-2011-join.zip_hive

    Hive: Join Strategies. Facebook summit-2011

    hive练习数据和练习题及答案

    hive练习数据和hive练习题包含了hive练习数据,hive数据的建表ddl和hive练习题,非常适合做hive练习,新手培训,快速...LEFT SEMI JOIN Hive当前没有实现 IN/EXISTS 子查询,可以用 LEFT SEMI JOIN 重写子查询语句。

    hive 中join和Group的优化

    set hive.map.aggr = true; //是否在 Map 端进行聚合,默认为 True ;该设置会消耗更多的内存。 set hive.groupby.mapaggr.checkinterval = 100000000; //在 Map 端进行聚合操作的条目数目 set hive.groupby....

    hive调优总结文档-hive tuning ppt

    hive调优总结,网络上分享的hive常见优化细节,join、shuffle优化等等。很不错

    【63课时完整版】大数据实践HIVE详解及实战

    50.Hive中的数据倾斜及解决方案-三种join方式 51.Hive中的数据倾斜及解决方案-group by 52.Hive中使用正则加载数据 53. Hive中使用Python脚本进行预处理 第5章:Zeus任务资源调度工具 54.资源任务调度框架介绍 55....

    Hive优化.docx

    Join 查找操作的基本原则:应该将条目少的表/子查询放在 Join 操作符的左边。原因 是在 Join 操作的 Reduce 阶段,位于 Join 操作符左边的表的内容会被加载进内存,将 条目少的表放在左边,可以有效减少发生内存...

    IT十八掌_Hive阶段学习笔记(课堂笔记与优化总结)

    IT十八掌第三期配套课堂笔记 1、Hive工作原理、类型及特点 2、Hive架构及其文件格式 ...4、Hive的JOIN详解 5、Hive优化策略 6、Hive内置操作符与函数 7、Hive用户自定义函数接口 8、Hive的权限控制

    Hive查询sql left join exists

    里面 一个例子,说了几个需求,基本能符合,我要使用的功能,左外连接,还有exists替代方案,都很实用,结合文档看一下。

    Hive用户手册中文版.pdf

    hive帮助文档中文版,添加了目录方便查找定位,分享出来以供交流使用。 包括hive基本结构、基本操作,select,join,参数设置等等用法

    hive调优策略

    hive数据仓库的调优,大小表Join,小文件调优,实现原理

    SQL left join

    SQL left join用法,初学者应用

    SQL、Hive SQL等SQL血缘解析工具

    String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = Delegate.getDelegate...

    hive-hbase-handler-1.2.1.jar

    Hive提供了与HBase的集成,使得能够在HBase表上使用hive sql 语句进行查询 插入操作以及进行Join和Union等复杂查询、同时也可以将hive表中的数据映射到Hbase中

Global site tag (gtag.js) - Google Analytics