或当前在配置单元的联接错误中不受支持 [英] OR not supported currently in JOIN error in Hive

查看:22
本文介绍了或当前在配置单元的联接错误中不受支持的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在配置单元中运行查询,如下所示,在左连接中有OR条件。当我运行SELECT时,它向我抛出两条错误消息。

  1. OR当前在联接中不受支持(了解或仅适用于配置单元中的对等联接)

  2. 在联接‘cre_Timestamp’中同时遇到左别名和右别名

           a.line_id,
           a.seller,
           a.sellerid,
           a.sellername,
           a.item_no,
           a.item_cd,
           a.cre_timestamp
     from Table A
     left join Table B
     on translate(a.id,'0','') = translate(b.id,'0','')
     or translate(a.seller,'Z','') = translate(b.seller,'Z','')
     or (a.item_no=b.item_no and a.item_no is not null and a.item_cd is not null and a.item_no <> '' and a.item_cd <> '')
     left join ( select id, line_id,cre_timestamp from table x) C
     on a.id=c.id
     and a.cre_timestamp < c.cre_timestamp
     and a.cre_timestamp > date_sub(c.cre_timestamp,21)
     and translate(a.id,'0','') = translate(b.id,'0','') or a.item_cd = b.item_cd
    where a.seller is null

我们如何解决此问题?

#1: 我可以尝试编写查询的一种方法是,对于OR条件,使用UNION复制查询3次。

2的#:

如果我切断

and a.cre_timestamp < c.cre_timestamp
     and a.cre_timestamp > date_sub(c.cre_timestamp,21)

并将其放入底部的where子句中,它工作得很好。(希望了解它在联接中不起作用的原因)

总的来说,寻找一种更好的方法,它不会影响运行时和更优化的查询,如果我将其更改为使用UNION,它必须处理同一查询3次,这将影响查询。

感谢您抽出时间调查此问题。

推荐答案

我在这篇文章中已经尝试解释了为什么非等(Theta)连接不能在Map-Reduce框架中工作,这里不再重复,请阅读:Why Hive can not support non-equi join

现在,如果将非相等连接条件移到WHERE子句中会发生什么:连接将仅使用相等条件工作,并且可能会产生一些重复,因为它可以是多对多连接。这些重复项将按WHERE条件进行筛选。在最坏的情况下,如果您根本没有相等条件,将执行交叉连接,这也很容易使用MapReduce框架实现,然后您可以在WHERE中过滤行。过滤也很容易实现。

这是目前Theta-Join在配置单元中实现的唯一方式:使用部分相等条件的复制连接(甚至交叉连接)加上过滤,这种方法可能会对性能产生显著的负面影响。但是,如果其中一个表小到可以放入内存中,则可以使用map-Join来补偿对性能的负面影响:

set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=1000000000; --small table size which can fit in memory, 
                                                 --adjust it and check Map Join operator in the plan

另外(这与问题无关)您的查询中有多余的条件:

(a.item_no=b.item_no and a.item_no is not null and a.item_cd is not null and a.item_no <> '' and a.item_cd <> '')

a.item_no is not null-此处不做任何有用的操作,因为1)此列已在等式联接条件中使用并且未联接Null,2)存在另一个条件a.item_no <> '',该条件排除Null,因为如果Value不等于空字符串,则它不能也为Null,Null不能等于或不等于某个值。

相同的冗余条件a.item_cd is not null,因为您已经有a.item_cd <> '',所以不允许为Null。

因此,整个条件可以简化为以下条件:

(a.item_no=b.item_no and a.item_no <> '' and a.item_cd <> '')
是的,将查询拆分为两个或多个+UNION是解决OR连接条件问题的常用方法。如果您有一些常见的过滤器,您可以使用WITH子查询来补偿多次扫描整个表。使用不同的筛选器和连接条件+UNION或UNION ALL拆分数据集也有助于处理倾斜的连接键。如果您使用的是TEZ,则使用WITH SUBQUERY将允许(在映射器上)读取一次表,并且所有其他顶点将读取由映射器准备的相同结果,从而消除每次将中间结果写入持久性存储的情况。

这篇关于或当前在配置单元的联接错误中不受支持的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆