如何在Hive查询中一起使用联接和平均值

时间:2014-09-03 19:17:49

标签: join hive aggregation

我在hive中有两个表:

表1 :uid,txid,amt,vendor Table2 :uid,txid

现在我需要在txid上加入表格,这基本上确认了最终记录的交易。有些交易只会出现在表1中,而不会出现在表2中。

我需要找出每个供应商每个用户(uid)找到的平均事务匹配数。然后我需要通过添加所有平均值来找到这些平均值的平均值,并将它们除以每个供应商的唯一用户数。

假设我有数据:

表1

u1,120,44,vend1
 u1,199,33,vend1
 u1,100,23,vend1
 u1,101,24,vend1
 u2,200,34,vend1
 u2,202,32,vend2

表2

u1,100
 u1,101
 u2,200
 u2,202

示例供应商vend1:

u1-> 平均事务查找率= 2(表1和表2中找到的匹配项)/ 4(表1中的总出现次数)= 0.5

u2 - > 平均交易查找率= 1/1 = 1

平均值 = 0.5 + 1(平均值之和)/ 2(唯一身份用户总数)= 0.75

必填项:

vend1,0.75
vend2,1

我似乎无法在每个供应商的每个用户的一个配置单元查询中找到Table1中的匹配和出现次数。我已达到此查询,无法找到如何进一步更改。

SELECT A.vendor,A.uid,count(*)as totalmatchesperuser FROM Table1 A JOIN Table2 B ON A.uid = B.uid AND B.txid = A.txid group by vendor,A.uid

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

我认为你的JOIN遇到了麻烦。当您JOIN txiduid uid时,您将失去每组1次。如果我是你,我会将table2列分配给success,并将列命名为transactionLEFT OUTER JOIN并执行1 }。然后,在新表格中,如果已完成交易,则会在其中包含编号为NULL的列,否则为case。然后,您可以执行NULL语句将这些0转换为select vendor ,(SUM(avg_uid) / COUNT(uid)) as avg_of_avgs from ( select vendor ,uid ,AVG(complete) as avg_uid from ( select uid ,txid ,amt ,vendor ,case when success is null then 0 else success end as complete from ( select A.* ,B.success from table1 as A LEFT OUTER JOIN table2 as B ON B.txid = A.txid ) x ) y group by vendor, uid ) z group by vendor

<强>查询:

vend1    0.75
vend2    1.0

<强>输出:

B.success
第17行中的

1table2的列,我将JOIN放在case之前。如果您对Hive中的{{1}}语句感到好奇,可以找到它们here

答案 1 :(得分:0)

GoBrewers14精彩而准确的回答!!非常感谢。我从错误的角度看待它。

我在查询中做了一些改动,以便最终完成任务。

我不需要为table2添加“成功”列。我在上面的查询中检查了B.txid而不是B.success。如果未找到匹配项,则B.txid将为null,如果找到匹配项,则为某个值。检查成功&amp;失败条件本身没有添加新列。然后我在上面的部分中将NULL设置为0并将!NULL设置为1。此外,我更改了一些变量名称,因为hive发现它不明确。

最终查询如下:

select vendr
    ,(SUM(avg_uid) / COUNT(usrid)) as avg_of_avgs
from (
    select vendr
        ,usrid
        ,AVG(complete) as avg_uid
    from (
        select usrid
            ,txnid
            ,amnt
            ,vendr
            ,case when success is null then 0
              else 1
              end as complete
        from (
            select A.uid as usrid,A.vendor as vendr,A.amt as amnt,A.txid as txnid
                ,B.txid as success
            from Table1 as A
            LEFT OUTER JOIN Table2 as B
            ON B.txid = A.txid
             ) x
         ) y
    group by vendr, usrid
     ) z
group by vendr;