我有一个包含以下列的表
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])
答案 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)
上添加功能请求