hql(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条件)(2024年注释:真的是join吗?)

union
联合操作

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

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

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

selectnull
做完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,hadoop)