hive sql中的join

1 几种join方式

join

join对应于inner join 内连接。
当多张表进行join的时候,所有表中与on条件中匹配的数据才会显示。
hql(即hive sql)的on子句中只支持and,不支持 or,也不支持null的对比。

left outer join

左外连接,也称为左连接。
以左表为基准,如果右表有条件匹配的数据,则显示,否则显示为null

right outer join

与左外连接相反,以右表为基准,若左表有条件匹配的数据,则显示,否则显示为null

full outer join

全外连接,返回所有表中满足where条件的数据,不满足的以null代替。

left semi join

左半连接,查询出满足on条件的左表的数据。左表的记录在右表中找到对应的记录,则右表停止扫描。
selectwhere子句不能引用右表的字段。

right semi join

右半连接,类似左半连接。hql不支持right semi join

笛卡尔积

左表数据乘以右表数据。使用join,(跟内连接的区别貌似是没有on条件)

union

联合操作

2 避免踩坑

left outer join

左外连接的结果条数应该与左表的条数一样多。如果右表关联的字段存在重复时,会让结果条数变多。

full outer join

不要把右表的 where条件写在 on 语句中

join特别慢

reduce阶段特别慢,可能发生数据倾斜,或者join on字段存在null值。

select 非null值

做完full outer join后,想要选择非空的列值作为结果,可以使用 coalesce

SELECT COALESCE(table1.id, table2.id) AS id,
table1.name,table1.family,table2.orderr,table2.countt
FROM table1 FULL OUTER JOIN table2
ON table1.id = table2.id

(网上还有一种用法是isnull,没有证实过

SELECT ISNULL(table1.id, table2.id) AS id,
table1.name,table1.family,table2.orderr,table2.countt
FROM table1 FULL OUTER JOIN table2
ON table1.id = table2.id

order by & sort by

order by对所有数据在一个reduce中全排序。如果设置hive.mapred.mode=strict,在全排序时必须结合limit使用。
sort by 在每个reduce中进行排序(局部排序)

你可能感兴趣的:(hive sql中的join)