如何在Hive中使用group by和where子句与left outer join

时间:2015-02-21 17:31:02

标签: join hive bigdata

我必须在Hive中使用左外连接方法连接两个表。请在下面找到我的表格详细信息和所需的输出,

道歉以获得重大解释。我提供了所有信息,以便更清楚地表达我的怀疑。

表1列:

date1, srcid, claimno1  

Date1        srcid    claimno1

31-01-2015   ABC      432

31-01-2015   ABC      451

31-01-2015   ABC      435 

01-02-2015   ABC      451

表2列:

date2,claimno2,amount

Date2        claimno1  amount

31-01-2015   432       150.51

01-02-2015   451       250.61

31-02-2015   451       320.72

01-02-2015   432       381.65

必填项:

Date1        srcid    claimno1     amount

31-01-2015   ABC      432          381.65

31-01-2015   ABC      451          250.61

31-01-2015   ABC      432          381.65

01-02-2015   ABC      451          NULL

条件:

  

1)从table1需要选择日期为31-01-2015的记录

     

2)从table2需要选择日期为01-02-2015的记录

假设:

1)来自table1的claimno1不是唯一的,并且对于相同的date1

多次出现

2)table2的claimno2对于特定的date2

是唯一的

疑惑:

1)我是否需要在GROUP BY中提供所有选定的列? (否则会出现SemanticException错误)

2)当我在WHERE子句和ON子句中使用相同的条件时有什么区别?

我使用了以下查询,但无法获得所需的输出,

SELECT 
    a.date1, a.srcid, a.claimno1, b.amount
FROM
    table1 a
        LEFT OUTER JOIN
    tableb ON (a.claimno1 = b.claimno2)
WHERE
    a.date1 = '31-01-2015'
        AND b.date2 = '01-02-2015'
GROUP BY a.date1 , a.srcid;

失败: SemanticException [错误10002]:无效的列引用'claimno1'

SELECT 
    a.date1, a.srcid, a.claimno1, b.amount
FROM
    table1 a
        LEFT OUTER JOIN
    tableb ON (a.claimno1 = b.claimno2)
WHERE
    a.date1 = '31-01-2015'
        AND b.date2 = '01-02-2015'
GROUP BY a.date1 , a.srcid , a.claimno1;

失败: SemanticException [错误10002]:无效的列引用'amount'

SELECT 
    a.date1, a.srcid, a.claimno1, b.amount
FROM
    table1 a
        LEFT OUTER JOIN
    tableb ON (a.claimno1 = b.claimno2)
WHERE
    a.date1 = '31-01-2015'
        AND b.date2 = '01-02-2015'
GROUP BY a.date1 , a.srcid , a.claimno1 , b.amount;

结果:未选择任何记录

SELECT 
    a.date1, a.srcid, a.claimno1, b.amount
FROM
    table1 a
        LEFT OUTER JOIN
    tableb ON (a.claimno1 = b.claimno2
        AND a.date1 = '31-01-2015'
        AND b.date2 = '01-02-2015')
GROUP BY a.date1 , a.srcid , a.claimno1 , b.amount;

结果:已选择记录,但金额值为NULL

道歉以获得重大解释。我提供了所有信息,以便更清楚地表达我的怀疑。

提前致谢。

0 个答案:

没有答案