hive left semi join

SELECT name
FROM table_1 a
    INNER JOIN table_2 b ON a.name=b.name

SELECT name
FROM 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 左表中的列,并且当右表中存在多个行与左表匹配时,左表只会输出一次;

 

你可能感兴趣的:(hive left semi join)