我在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
任何帮助都会很棒。
答案 0 :(得分:1)
我认为你的JOIN
遇到了麻烦。当您JOIN
txid
和uid
uid
时,您将失去每组1
的总次。如果我是你,我会将table2
列分配给success
,并将列命名为transaction
或LEFT 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行中的 1
是table2
的列,我将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;