Hive中JOIN操作

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)

时间: 2024-12-21 05:02:31

Hive中JOIN操作的相关文章

Hive中join, outer join, semi join区别

Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 最常用的就是多表关联查询,主要讲解下join.outer join和semi join的具体使用. join是最简单的关联操作,两边关联只取交集. outer join分为left outer join.right outer join和full outer join. left outer join是以左表驱动,右表不存在的

MySql 中Join操作的用法

SQL标准中的Join的类型: 首先,设置表employees和department的数据为: 1.inner join - on操作类型 内连接inner join是基于连接谓词将两张表(如A和B)的列组合在一起的,产生新的结果表. 例子: SELECT * FROM employees a inner join department b ON a.department_id = b.department_id 查询结果为: 注意:inner join 可以简写为join,该查询得出的结果为两

Hive 中Join的专题---Join详解

1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RIGHT join是连接从左边还有右边? Hive表连接的语法支持如下: Sql代码  : join_table: table_reference JOIN table_factor [join_condition] | table_reference {LEFT|RIGHT|FULL} [OUTER

hive中时间操作(二)

转:https://blog.csdn.net/qq646748739/article/details/77997276 --Hive中日期函数总结:--1.时间戳函数--日期转时间戳:从1970-01-01 00:00:00 UTC到指定时间的秒数select unix_timestamp(); --获得当前时区的UNIX时间戳select unix_timestamp('2017-09-15 14:23:00'); select unix_timestamp('2017-09-15 14:2

Hive中join

Hive-表连接 1)Hive只支持等值连接,即ON子句中使用等号连接,不支持非等值连接. 2)如果连接语句中有WHERE子句,会先执行JOIN子句,再执行WHERE子句 3)测试 假设有以下测试数据 表user数据如下 User_id name 1 张三 2 李四 3 王五 表job数据如下 Job_id job user_id 1 工程师 1 2 美工 2 3 美工 4 建表语句如下 CREATE TABLE IF NOT EXISTS user(id int, name string) R

【大数据学习--hive】hive中执行select * from tablename 报错问题。

在虚拟机中搭建hive之后,创建了表,在执行select * from tablename的时候报错,具体报错信息如下: hive> select * from hive_01; FAILED: SemanticException Unable to determine if hdfs://master:9000/user/hive/warehouse/hive_1.db/hive_01 is encrypted: java.lang.IllegalArgumentException: java

hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from  wizad_mdm_dev_lmj_20141120 as w JOIN wizad_mdm_main as a ON (a.rowkey = w.guid); 程序启动后,死循环,无反应.最后在进行到0.83时,内存溢出失败. 原因: 默认情况下,Hive会自动将小表加到DistributeCa

MapReduce中的Reduce join操作

-------file1[ID NAME]-------- 1 zhangsan2 lisi3 wangwu -------file2[ID VALUE]--------1 452 563 89 -------结果[NAME VALUE]------------zhagnsan 45lisi 56wangwu 89 一般数据库的join操作 a join b  on a.id = b.id 后面的条件在reduce中指的是相同的key,在sql中很容易区分出后面条件的字段到底来自那张表 而在Ma

MapReduce中的Map join操作

可以使用setup进行去读,吧数据读取放到一个容器中,在map段去读的时候,可以根据ID就找出数据,然后再转化回来 map端的join 适用场景,小表可以全部读取放到内存中,两个在内存中装不下的大表,不适合Map端的join操作 在一个TaskTracker中可以运行多个map任务.每个map任务是一个java进程,如果每个map从HDFS中读取相同的小表内容,就有些浪费了.使用DistributedCache,小表内容可以加载在TaskTracker的linux磁盘上.每个map运行时只需要从