다음 PIG 데이터를 고려하시기 바랍니다 (가방에)지도에서 값을 추출 :돼지 :
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)
각 SEARCH_ID/USER_ID 조합에 대한 여러 레코드가있을 수 있습니다; 따라서 나중에 코드에서 레코드를 그룹화합니다. 그러나 두 개의 특정 param_names - 'location'과 'type'에만 관심이 있습니다 : filtered = FILTER search_values by (param_name == 'type'또는 param_name == 'location');
이론상 '위치'가있는 행과 '유형'이있는 행이 항상 있습니다. 그러나 '유형'이없는 경우가 있습니다. 그러므로 나는 그것을 '모두'(나중에)로 대체 할 필요가있다.
가장 쉬운 방법은 param_name으로 데이터를 분할 한 다음 search_id로 (OUTER) 조인하는 것입니다. 그러나 나는 PIG에서 가방의 힘을 활용하고 싶습니다.
나는 아무 소용이지도에 가방을 변환, 가방을 사용하여 다양한 접근을 시도했다 :
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_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
원하는 결과가되어야한다
(SEARCH_ID 266 종류, 위치)
(1, 1, Commercial, San Francisco)
이 문제를 해결하는 데 큰 도움이 되었으면 도움이 될 것입니다.