如何在Hive中使用子查询进行联接?

时间:2019-02-08 18:23:19

标签: hive subquery

我正在使用hive 1.2.1,尝试使用子查询加入时遇到了一些问题。

我的主表是应用程序,我正在尝试根据帐户和日期将其加入表信用。当我尝试仅获得一行时,日期条件给我带来麻烦(功劳必须在应用程序之后,并且只能是避免在联接中出现重复的一项)。我正在使用以下代码:

SELECT          COUNT(1)
FROM            applications apps
LEFT JOIN       credits c
            ON c.python_id = 
            (
                    SELECT          python_id
                    FROM            credits cr
                    WHERE           cr.ind in ('NP','0P')
                    AND             cr.acct_nbr = apps.acct_nbr 
                    AND             cr.date >= apps.date
                    ORDER BY        cr.date DESC
                    LIMIT 1
            ) 

我遇到以下错误:

[Code: 40000, SQL State: 42000]  Error while compiling statement: FAILED: ParseException line 8:24 cannot recognize input near 'SELECT' 'python_id' 'FROM' in expression specification

能请你帮忙吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您应该基于act_nbr加入,并在where子句中使用日期作为过滤器。

SELECT  COUNT(1)
FROM    applications apps
JOIN    credits c
ON      c.acct_nbr = apps.acct_nbr
WHERE   c.ind in ('NP','0P')
AND     c.date >= apps.date
ORDER BY c.date DESC
LIMIT 1

答案 1 :(得分:0)

与您的查询有关的问题是

> hive does not support sub query with equals clause, you can write sub query only for IN, NOT IN, EXISTS and NOT EXISTS clause.
> You cannot have a sub query which returns more than one row.

请查看-[https://cwiki.apache.org/confluence/display/Hive/Subqueries+in+SELECT][1]

您的逻辑也有问题。

我的理解是,您正在尝试从左连接的主表中获取计数,并且外部查询没有定义过滤条件来说明您想要的记录。

因此,计数将始终等于主表(应用程序)中的记录数。如果您可以提供具有预期输入和输出的样本数据,我们将帮助您进行查询。

希望这会有所帮助。