2013-01-15 40 views
1

我有这样的一个表:做交叉表在蜂房(0.9版本)

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上,不支持交叉连接。

谢谢!

回答

1

你想要一个表格,对于每一对运动,列出了同时参加两项运动的人数?

如果是这样,你可以做,在流Hadoop和蟒蛇:

  • 通行证运动,PERSONID

    • 排序PERSONID成Python
    • 缓存,将personId,和所有的运动添加到列表
    • 在得到一个不同的PERSONID,做到这一点:

    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从流式作业输出的中间表中。

  • +0

    是的,我做了双组合,它做了诡计,尽管它没有输出表格。我稍后会研究python reducer。 – S4M