我有一张这样的表:
sport personId
1 1
1 2
1 3
2 1
2 4
2 6
3 1
3 3
3 6
我想得到一个表格,其中包含相当于伪代码的运动项目的数量:
for sport1 in sports:
for sport2 in sports:
X[sport1,sport2] = count(intersect(sport1,sport2))
如果我只参加几项运动,我知道我会这样做:
select count(*) from (select * from table where sport = sport1) t1 join (select count(*) from table where sport = sport2) t2 on t1.personId = t2.personId;
但我想为我的所有运动制作一张桌子。
请注意,我使用的是Hive 0.9,它不支持交叉连接。
谢谢!
答案 0 :(得分:1)
你想要一张表,对于每对运动,列出同时参加这两项运动的人数吗?
如果是这样,你可以在流式传输hadoop和python中做到这一点:
for i, sport1 in enumerate(sports):
for sport2 in sports[i:]:
print '\t'.join([sport1, sport2, '1'])
然后从流媒体作业的中间表输出select sport1, sport2, count(*) as c group by sport1, sport2
。