Hive 中带有 Join 或 Where 子句的条件

Posted

技术标签:

【中文标题】Hive 中带有 Join 或 Where 子句的条件【英文标题】:Condition with Join or Where Clause in Hive 【发布时间】:2015-09-15 14:29:16 【问题描述】:

我想了解 hive 如何执行这两个查询。我们在 Hive 中有任何查询优化器吗?

select * from A JOIN B on A.a = B.b 

select * from A JOIN B where A.a = B.b

请告诉我 Hive 查询是如何执行的(工作流程)?

提前致谢。

【问题讨论】:

【参考方案1】:

不幸的是,Hive 似乎在这里没有做任何好的后端优化。我给自己写了几个例子,并比较了阶段计划和抽象语法树。

select * from A JOIN B on A.a = B.b 

在上述查询中,hive 找到 A.a = B.b 的位置,然后将两者连接在一起。

select * from A JOIN B where A.a = B.b

在此查询中,hive 在每个值上将 A 连接到 B - hive 执行交叉连接,这是一个大规模的映射阶段(假设您的表很大)。然后在 reduce 阶段,hive 过滤掉 A.a != B.b

的行

【讨论】:

感谢@Charlie Haley 的回复。能否请您告诉我获取阶段计划和抽象语法树的方法? 如果表 A 和 B 已经在 hive 中,只需输入说明(在此处插入查询); 如果你能解释一下,请告诉我hive中的查询执行流程是什么?

以上是关于Hive 中带有 Join 或 Where 子句的条件的主要内容,如果未能解决你的问题,请参考以下文章

hive 的 left semi join

在 from 子句或 where 子句中进行 equi join 是不是更好

LEFT JOIN 中带有子句的 Hql 错误

Laravel 5.8,在 where 子句中带有 Count(*) 的棘手子查询

where 子句中带有字符的整数字段返回奇怪的输出

SQL Server 中带条件的 Where 子句