SQL选择通过至少一个公共属性值来交叉记录?

时间:2014-04-10 14:24:35

标签: sql select hadoop hive

我有一个包含两个字段的表:

+-----+---------+
| id  | feature |
+-----+---------+
| x1  |  f1     |
| x1  |  f5     |
| x2  |  f3     |
| x3  |  f1     |
| x4  |  f5     |
| x4  |  f2     |
| x5  |  f3     |
| x6  |  f4     |
+-----+---------+

问题:

1)如何编写将select分组为id - s的集合的feature,如下所示:S1 = {x1,x3},S2 = {x1,x4 },S3 = {x2,x5},S4 = {x2,x5}

2)如何编写select将返回一个所有id - s至少相交一个特征的集合?如何获得所有这些设置?在此示例中,结果应为:S5 = {x1,x3,x4},S6 = {x2,x5}

3)了解支持一些基本SQL子集的Hadoop Hive的查询格式也很棒。

2 个答案:

答案 0 :(得分:0)

对于问题1,请使用collect_set或collect_list UDF。

(Protip:一次一个问题在StackOverflow上效果最好。)

答案 1 :(得分:0)

最简单的第二种方法可能是自连接,如果数据集不是太大,这是可行的

SELECT t1.id, t2.id, collect_set( feature ) features
FROM
  ( SELECT id, feature FROM mytable ) t1
JOIN
  ( SELECT id, feature FROM mytable ) t2
ON
  ( t1.feature = t2.feature )
WHERE 
   t1.id < t2. id
GROUP BY t1.id, t2.id;

请务必使用where子句将输出减半。