在Pig中将多个地图组合在一起

时间:2014-02-14 23:22:32

标签: hadoop mapreduce apache-pig

我第一次使用猪。我已经达到了我想要的答案,但是采用了一种奇怪的嵌套格式:

{(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 个答案:

答案 0 :(得分: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;
}

UDF可以将任意数量的地图作为参数。

请注意,如果两个或多个地图共享一个密钥,那么遇到的最后一个地图将是保留的地图,而其他地图将被覆盖。