在hive中进行交叉表(0.9版)

时间:2013-01-15 16:58:24

标签: hive

我有一张这样的表:

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 个答案:

答案 0 :(得分:1)

你想要一张表,对于每对运动,列出同时参加这两项运动的人数吗?

如果是这样,你可以在流式传输hadoop和python中做到这一点:

  • 按personId排序
  • 通过体育,personId进入Python
  • 缓存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