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条件的左表的数据。左表的记录在右表中找到对应的记录,则右表停止扫描。select
和where
子句不能引用右表的字段。
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
值。
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,没有证实过文章来源:https://www.toymoban.com/news/detail-812371.html
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
中进行排序(局部排序)文章来源地址https://www.toymoban.com/news/detail-812371.html
到了这里,关于hql(hive sql)中的join及踩过的坑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!