本文主要是介绍hive left semi join,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SELECT name
FROM table_1 aINNER JOIN table_2 b ON a.name=b.nameSELECT name
FROM table_1 aLEFT 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!