hive left semi join

来源:互联网 发布:《淘宝规则》 编辑:程序博客网 时间:2024/04/27 21:28

SELECT nameFROM table_1 a    INNER JOIN table_2 b ON a.name=b.nameSELECT nameFROM table_1 a    LEFT SEMI JOIN table_2 b ON (a.name=b.name)

difference between inner join and left semi join:

hive 中inner join 和left semi join 的不同:

如上述例子,使用inner join 时,会返回在左右两边都同时存在的记录,尤其,当右表中存在多行与左表相匹配时,则会返回多行;

类似于,在map中,t1,t2都按照关联字段name为key输出,然后在reduce再依输出匹配上的左右表数据:

map{

if(t1){

out(name,value)

}

if(t2){

out(name,value)

}


reduce{

for(t1.rows){

for(t2.rows){

out(t1.row+t2.row)

}

    }

}

使用left semi join时,则仅会返回左表中的记录,并且是存在右表匹配的行;

类似:先将右表的name列缓存成list,然后判断每次左表的输入的一行的name值是否存在于这个list中,

map{

if(t1){

if(t2.name.contains(t1.name))

{out(t1)}

}

因而,在left semi join,只能select 左表中的列,并且当右表中存在多个行与左表匹配时,左表只会输出一次;

 

0 0