如何将数组累积到地图中?

时间:2014-04-07 21:00:39

标签: sql hive hiveql

我有一个表T,其中包含列:

cookie     string  
keywords   array<string>   
fqdn       string  
pixel      bigint  

我想写点像

select cookie, ???? from T group by cookie;

获取包含列

的表格
cookie     string  
keywords   map<string,int>   
fqdn       map<string,int>  
pixel      array<bigint>

,其中

  • cookie是唯一的(由by cookie保证)
  • keywords计算关键字在原始表T
  • 中所有数组中出现的次数
  • fqdn计算域在给定Cookie的所有行中出现的次数
  • pixel计算像素在给定Cookie的所有行中出现的次数

1 个答案:

答案 0 :(得分:1)

你实际上可以使用&#34;向量&#34; Brickhouse中的UDF(http://github.com/klout/brickhouse)。在Brickhouse中,数组或地图可以被视为&#34; vector&#34;。对于数组,数组索引被视为维度,数值被视为该维度中的大小。对于地图,我们将字符串键视为&#34;尺寸&#34;在非常大的空间中的矢量,并且地图值是幅度。 (这是针对文本分析类型的问题,类似于你正在做的事情)。

以下内容应该有效

SELECT cookie,
   union_vector_sum( keyword_map),
   union_vector_sum( map( fqdn, 1 ) ),
   collect_set( pixel)
FROM (
  SELECT cookie, fqdn, pixel,
         collect( keyword, 1 ) as keyword_map
  FROM T
  LATERAL VIEW explode( keywords ) k as keyword
  GROUP BY cookie, fqdn, pixel ) xk
GROUP BY cookie;

我们可能应该有一个新的Map构造函数UDF,它接受一个数组和一个值,所以我们不需要内部爆炸和收集。我不认为它会以这种形式产生额外的map-reduce步骤。

有一些矢量,和#34;字袋&#34;现在Brickhouse中的UDF,我们可能应该添加更多。你有什么特别要求吗?