pig:从map(包中)中提取值

n7taea2i  于 2021-06-21  发布在  Pig
关注(0)|答案(1)|浏览(370)

请考虑以下清管器数据:

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,商业,旧金山)
任何帮助解决这个问题将不胜感激!

ar7v8xwq

ar7v8xwq1#

试着用压平机把Map从袋子里拿出来。

相关问题