2014-04-19 4 views
1

다음 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)

이 문제를 해결하는 데 큰 도움이 되었으면 도움이 될 것입니다.

답변

0

지도를 가방에서 꺼내려면 FLATTEN을 사용해보십시오.