如何使用字符串键和数组作为值创建映射(brickhouse hive UDF)

时间:2014-04-22 22:42:38

标签: hive

我有一个包含以下列的表

transaction_id,
mode,
tag_name,
tag_type

transaction_id可能有多个标记名称,每个标记名称可能有不同的类型(在事务的上下文中)

我正在尝试用这个

创建一个新表
transaction_id,
mode
tagnametype map<tag_name, tag_type>
tagtypename map<tag_type, array<tag_name>>

使用单个查询

create table transaction_tags
select transaction_id, mode, collect(tag_name, tag_type), collect(tag_type, tag_name)
from transactions
group by trans
action_id, mode

第一张地图没有问题,因为交易的tag_name是唯一的,它将拥有所有值。但是第二种只有每种类型的一个值。这告诉我它的行为就像最近覆盖现有的Java Map。是否有值在一个数组中针对密钥收集所有这些?

像反转一样。例如反转(map(k,v))= map(v,[k])

1 个答案:

答案 0 :(得分:0)

可悲的是,以下查询应该有效,但可能不是您想要做的。 我不确定当前的Hive优化器是否可以在单个MapReduce作业中执行此查询。 (我的猜测是否定的。)

SELECT transaction_id,
       mode,
       tn.tagnametype,
       tt.tagtypename 
FROM
  ( SELECT transaction_id, mode,
           collect( tag_name, tag_type ) as tagnametype
     FROM trans_table
     GROUP BY transaction_id, mode
  ) tn
JOIN
  ( SELECT transaction_id, mode,
          collect( tag_type, tag_name_array ) as tagtypename
    FROM
      ( SELECT transaction_id, mode,
               collect( tag_name ) as tag_name_array 
         FROM trans_table
         GROUP BY transaction_id, mode
      ) tc
  ) tt
ON ( tn.transaction_id = tt.transaction_id 
  AND tn.mode = tt.mode );  

也许我们应该添加一个&#39;收集&#39;或者&#39;积累&#39; UDF,它创建一个包含键的所有值的数组。请在github网站(http://github.com/klout/brickhouse/issues

上添加功能请求