【问题标题】:How do I accumulate arrays into maps?如何将数组累积到地图中?
【发布时间】:2014-04-07 21:00:39
【问题描述】:

我有一张表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 的所有行中出现的次数

【问题讨论】:

    标签: sql hive hiveql


    【解决方案1】:

    您实际上可以在 Brickhouse (http://github.com/klout/brickhouse) 中使用“矢量”UDF。在 Brickhouse 中,数组或映射都可以视为“向量”。对于数组,数组索引被认为是维度,而数值被认为是该维度中的大小。对于一个map,我们把string key看作是向量在一个非常大的维度空间中的“维度”,map的值就是幅度。 (这是针对文本分析类型的问题,类似于您正在做的事情)。

    类似下面的东西应该可以工作

    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 步骤。

    现在 Brickhouse 中有一些向量和“词袋”UDF,我们可能应该添加更多。你有什么特别的要求吗??

    【讨论】:

    猜你喜欢
    • 2016-05-24
    • 2014-03-06
    • 2013-08-31
    • 1970-01-01
    • 2022-11-02
    • 2022-01-24
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多