Join 如何在配置单元查询中同时使用联接和平均值
我在蜂箱中有两张桌子: 表1:uid、txid、金额、供应商表2:uid、txid 现在,我需要加入txid上的表,这基本上确认了最终记录的事务。有些交易只出现在表1中,而不出现在表2中 我需要找出每个用户(uid)和每个供应商的平均事务匹配数。然后我需要求出这些平均值的平均值,将所有平均值相加,然后除以每个供应商的唯一用户数 假设我有数据: 表1: U1120,44,卖方1Join 如何在配置单元查询中同时使用联接和平均值,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
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.752,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
的一列,我将inttable2
放在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的数据文件。人们怎么在这里聊天呢?