Join 如何在配置单元查询中同时使用联接和平均值

Join 如何在配置单元查询中同时使用联接和平均值,join,hive,aggregation,Join,Hive,Aggregation,我在蜂箱中有两张桌子: 表1:uid、txid、金额、供应商表2:uid、txid 现在,我需要加入txid上的表,这基本上确认了最终记录的事务。有些交易只出现在表1中,而不出现在表2中 我需要找出每个用户(uid)和每个供应商的平均事务匹配数。然后我需要求出这些平均值的平均值,将所有平均值相加,然后除以每个供应商的唯一用户数 假设我有数据: 表1: U1120,44,卖方1 U1199,33,卖方1 U1100,23,卖方1 U1101,24,卖方1 U2200,34,卖方1 U2202,32

我在蜂箱中有两张桌子:

表1:uid、txid、金额、供应商表2:uid、txid

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

我需要找出每个用户(uid)和每个供应商的平均事务匹配数。然后我需要求出这些平均值的平均值,将所有平均值相加,然后除以每个供应商的唯一用户数

假设我有数据:

表1

U1120,44,卖方1
U1199,33,卖方1
U1100,23,卖方1
U1101,24,卖方1
U2200,34,卖方1
U2202,32,2

表2

U1100
u1101
U2200
U2202

供应商供应商示例1:

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
u1->Avg事务查找率=2(在表1和表2中都找到匹配项)/4(在表1中的总发生率)=0.5

u2->平均事务查找率=1/1=1

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

所需输出:

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
vend1,0.75
2,1

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

从表1 A中选择A.vendor,A.uid,count(*)作为totalmatchesperuser,并将表2 B中的A.uid=B.uid和B.txid=A.txid按供应商A.uid分组


任何帮助都会很好。

我认为您的
加入遇到了麻烦。当您通过
txid
uid
加入
时,您将丢失每组
uid
的总数。如果我是你,我会将
1
列分配给
表2
,并将该列命名为
success
transaction
,然后执行
左外联接。然后,在新表中,如果有已完成的事务,则会有一列,其中的编号为
1
,否则为
NULL
。然后,您可以执行
case
语句将这些
NULL
s转换为
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
输出:

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

第17行中的
B.success
1
的一列,我将int
table2
放在
JOIN
之前。如果你对
Hive
中的
case
语句感到好奇,你可以找到它们

Gobrewers给出的惊人而精确的答案14!!非常感谢你。我从一个错误的角度看它

为了最终完成任务,我在查询中做了一些更改

我不需要在表2中添加“成功”列。我在上面的查询中选择了B.txid,而不是B.success。B.txid在未找到匹配项的情况下为空,在找到匹配项的情况下为某个值。在不添加新列的情况下检查成功和失败条件本身。然后我将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;

我使用文件夹结构(year=2014/month=09/day=05/hour=16/)对这两个表进行了分区,但当我添加where子句::where Table1.year=“2014”和Table1.month=“09”以及Table1.day=“05”和Table1.hour=“16”以及Table2.year=“2014”和Table2.month=“09”以及Table2.day=“05”和Table2.hour=“16”时。我遗漏了表1中的一些数据。有没有一种特定的方法可以将分区应用于正在连接的表?hmmmm。不知道你在问什么。你可以打开另一个问题,或者我们可以聊天。管理员对与原始问题无关的冗长注释部分感到恼火。我只是想问一下如何更改查询,以便以相同的方式查询配置单元中分区的表、表1和表2,但只使用分区特定的数据。就像我希望每小时对上一个小时的数据运行一次查询一样,我希望连接来自两个表和相同分区的同一小时的数据。分区结构为/somehdfspath_Table1/year=2014/month=09/day=07/hour=12/表1的数据文件和/somehdfspath_Table2/year=2014/month=09/day=07/hour=12/表2的数据文件。人们怎么在这里聊天呢?