请考虑以下清管器数据:
search_values = FOREACH raw_search GENERATE
search_id,
user_id,
param_name,
param_value;
describe search_values;
search_values: {search_id: int,user_id: int,param_name: chararray,param_value: chararray}
dump search_values;
(1, 1, location, San Francisco)
(1, 1, type, Commercial)
每个搜索id/用户id组合可能有多个记录;因此,我将在代码的后面对记录进行分组。但是,我只对两个特定的param_名称感兴趣-'location'和'type':filtered=filter search_value by(param_name=='type'或param_name=='location');
理论上,总是有一行带有“location”和“type”;但是,有些情况下“type”不存在;因此,我需要用“all”(稍后)替换它。
我知道最简单的方法是按param\u name拆分数据,然后(outer)按search\u id连接;不过,我想利用Pig袋的力量。
我试过各种方法来使用袋子,把袋子转换成Map,但都没有用:
maps = FOREACH filtered GENERATE search_id, user_id, TOMAP(param_name, param_value) as tomap_values;
group_map = group maps by (search_id, user_id);
grouped = FOREACH group_map GENERATE
group.$0 as search_id,
group.$1 as user_id,
maps.tomap_values as map_bag;
这里的问题是map#bag是包中的一个map,我无法使用map#bag#'type'或map#bag#'location'从中提取值。
describe grouped:
{search_id: int,user_id: int,map_bag: {(tomap_values: map[])}}
如果尝试以下操作,将收到错误消息:
mapped = FOREACH grouped
GENERATE
search_id,
user_id,
map_bag.tomap_values#'type',
map_bag.tomap_values#'location';
ERROR 1052: Cannot cast bag with schema :bag{:tuple(tomap_values:map)} to map with schema :map
期望的结果应该是
(搜索id、用户id、类型、位置)
(1, 1,商业,旧金山)
任何帮助解决这个问题将不胜感激!
1条答案
按热度按时间ar7v8xwq1#
试着用压平机把Map从袋子里拿出来。