1

我有一张这样的桌子:

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

谢谢!

4

1 回答 1

1

您想要一个表格,针对每项运动列出同时参加这两项运动的人数?

如果是这样,您可以在流式处理 hadoop 和 python 中执行此操作:

  • 按人员 ID 排序
  • 将 sport、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从流式作业的中间表输出。

于 2013-01-24T22:37:13.397 回答