直接就总结了
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 Summit 2011-join介绍了Facebook中Hive实现的多种join策略。Hive作为一个数据仓库工具,主要用于处理大规模数据集的分析和查询,而join操作是数据仓库中常见且关键的操作之一。在大数据的背景下,如何高效地...
NULL 博文链接:https://weigang-gao.iteye.com/blog/2260663
【标题】:“Hive-Summit-2011-join.zip_hive”指的是一个关于HiveJoin策略的讨论,源自2011年Facebook峰会上的分享。 【描述】:“Hive: Join Strategies. Facebook summit-2011”说明了这个主题集中在Hive的连接...
### Hive SQL Left Join 数据缺失问题解析 #### 一、问题背景 在大数据处理场景中,Hive 是一种广泛使用的工具,用于对存储在 Hadoop 文件系统中的数据进行数据汇总、查询和分析。随着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 Join - **Join操作**:支持多种类型的JOIN操作,如INNER JOIN、LEFT JOIN等。 #### 十、Hive基本语法 - **常用语句**:包括SELECT、INSERT、UPDATE、DELETE等SQL-like语句。 #### 十一、Hive操作...
- **JOIN**:掌握JOIN的原则和技巧是提高Hive查询性能的关键。 - **合并小文件**:处理大量的小文件可能会影响Hive的性能。 #### 十、Hive FAQ - 提供了一些常见问题解答,帮助用户解决使用过程中遇到的问题。 ...
- Hive支持内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)以及全连接(FULL OUTER JOIN),但在某些情况下可能需要特殊处理以避免数据倾斜。 - **Inner Join**: - `SELECT t1.*, t2.* FROM ...
对于Hive的Map/Reduce操作,Hive支持Map Join操作,这种操作适用于小表与大表进行join时的数据处理。同时,Hive支持Bucket和Sampling操作,以帮助用户更有效地处理数据。 Hive的设计目标是简化Hadoop上数据仓库的...
- **8.8 Join中处理null值的语义区别**:Hive处理NULL值的方式可能与传统SQL不同。 #### 九、优化与技巧 - **9.1 全排序**:对于大规模数据集进行全排序可能会导致性能问题。 - **9.2 怎样做笛卡尔积**:在特定...
- Hive支持多种类型的JOIN操作,包括Inner Join、Left Outer Join、Right Outer Join等。 - 示例:`SELECT e.name, d.department_name FROM employees e JOIN departments d ON e.department_id = d.id;` #### 五、...
1. 对于 join 操作,如果出现数据倾斜,应当设置 set hive.exec.reducers.max=200;set mapred.reduce.tasks= 200;以增大 Reduce 个数。 2. 对于 group by 操作,如果出现数据倾斜,应当设置 set hive.groupby....
Hive支持大部分SQL标准,包括SELECT、FROM、WHERE、GROUP BY、JOIN等操作,使得用户可以方便地对Hadoop上的数据进行查询和分析。 【Hive函数】 Hive提供了丰富的内置函数,包括聚合函数(SUM、COUNT、AVG等)、数学...
如果设置为true,则Hive将自动将Reduce端的Common Join转化为Map Join,默认值为false。 5. hive.mapred.local.mem 该参数决定了Mapper/Reducer在本地模式的最大内存量,以字节为单位,0为不限制。如果设置为0,则...
Hive支持不同类型的JOIN操作,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN,但需要注意的是,JOIN操作在大数据环境中可能非常耗时,因此合理设计表结构和使用分区可以优化JOIN性能。 7. **Hive与其它大数据...
在Hive SQL中,JOIN操作是用来合并来自两个或多个表的数据。本文主要关注LEFT JOIN和EXISTS子句的使用,这两个都是数据查询中常见的技术,特别是在大数据处理领域,如Hadoop环境下的Hive。 首先,LEFT JOIN(左外...
它考虑了各种因素,如表大小、数据分布、JOIN 操作等,以生成最优的执行计划。 7. **数据生命周期管理**:Hive 提供了数据生命周期管理功能,可以设定数据的保留策略,自动清理过期的数据。 8. **与 BI 工具集成**...
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 ...