2014-02-14 2 views
0

Я использую свиньи в первый раз. Я добрался до места, где я точно ответ, который я хочу, но в причудливо вложенном формате:Объединение нескольких карт вместе в свинге

{(price,49),(manages,"1d74426f-2b0a-4777-ac1b-042268cab09c")} 

я хотел выход, чтобы быть одной картой, без упаковки:

[price#49, manages#"1d74426f-2b0a-4777-ac1b-042268cab09c"] 

Мне удалось использовать TOMAP, чтобы забраться так далеко, но я не могу понять, как слить и сгладить его.

{([price_specification#{"amount":49,"currency":"USD"}]),([manages#"newest-nodes/1d74426f-2b0a-4777-ac1b-042268cab09c"])} 

Как я должен идти об этом?

ответ

1

К сожалению, для вас нет встроенных функций. Вам придется написать свой собственный UDF. К счастью, это просто.

Метод exec бы просто пойти что-то вроде:

public Map<String, Object> exec(Tuple input) { 
    Map<String, Object> m = new HashMap<String, Object>(); 
    for (int i = 0; i < input.size(); i++) 
     m.putAll((Map<String, Object>) input.get(i)); 

    return m; 
} 

ОДС может принимать любое количество карт в качестве аргументов.

Обратите внимание, что если две или более карты разделяют ключ, то последний из них будет сохранен, а остальные будут перезаписаны.

+0

Благодарим вас, что я нашел http://stackoverflow.com/questions/17847970/transform-bag-of-key-value-tuples-to-map-in-apache-pig после многих поисковых запросов. Он предлагает тот же ответ, который у вас есть, используя UDF (хотя он использует язык python как язык). Этот ответ в конечном итоге работал для меня. – cschneid

Смежные вопросы