收集到蜂巢中的有序集

时间:2014-04-08 14:20:34

标签: hive hiveql

使用Hive内置的collect_set,我打算实现一个查询,我可以可靠地知道数组0索引是收集的第一个元素,最后一个索引是收集的最后一个元素。 - 例如:

cookie  page_num, 
1234      1 
1234      2 
1234      3 
1234      4 
4444      1
4444      2 

查询:

select cookie, collect_set(page_num) as page_set 
from mytable  
group by cookie

期望的结果:

1234  [1,2,3,4] 
4444  [1,2] 

实际无序结果:

1234 [2,4,1,3] 
4444 [2,1] 

如何收集到排序数组,其中排序基于传入行的顺序?

1 个答案:

答案 0 :(得分:0)

Brickhouse中的'collect_max'UDF(http://github.com/klout/brickhouse)将根据值对地图进行排序。 (也许我们应该添加一个排序UDF)。你可以使用它和group_count来获得你想要的东西

SELECT cookie, map_keys( 
         collect_max( page_num, row_order, MAX_NUM_PAGES ) )
FROM (
    SELECT cookie, page_num, group_count( cookie ) as row_order
      FROM mutable
      DISTRIBUTE BY cookie
      SORT BY cookie, my_sort_column 
) sc
GROUP BY cookie;

我很确定这会奏效。