如何根据数据类型制作Apache Pig FLATTEN?

时间:2018-09-27 15:53:52

标签: apache-pig amazon-emr

我有大量的数据,其字段为iddetailsdetails是地图或地图包。我的最终目标是为数据中所有地图中的每个条目输入id, key, value

0.16中,我可以自由使用FLATTEN以确保每行只有一张地图,然后使用UDF展平地图。但是由于0.17FLATTEN也适用于地图。这导致一种情况,在使用一次后,我完全按照自己的方式拥有了一些数据,但是其余数据仍然在地图中。

基本上,我需要对一半的数据使用一次FLATTEN,对另一半使用两次。有没有一种方法可以检测GENERATE语句中的数据类型以仅对数据进行拼合处理?

为了说明,给出

(ID1, [key1#val1,key2#val2])
(ID2, {[key3#val3, key4#val4]})

我要生成

(ID1, key1, val1)
(ID1, key2, val2)
(ID2, key3, val3)
(ID2, key4, val4)

1 个答案:

答案 0 :(得分:0)

您基本上需要一个UDF,它将告诉您输入是否为有效地图。使用这样的UDF,仅当特定字段是有效映射时,才可以将三元操作设置为FLATTEN。 Mozilla的Akela拥有您正在寻找的确切UDF。您可以在https://github.com/mozilla-metrics/akela找到Akela开源存储库,在https://github.com/mozilla-metrics/akela/blob/master/src/main/java/com/mozilla/pig/filter/map/IsMap.java

找到感兴趣的UDF。

用法类似于以下内容:

IMPORT <path_to_jar>/akela.jar
DEFINE IsMap com.mozilla.pig.filter.map.IsMap();

data = LOAD '<path_to_data>';

dataFlattened = FOREAH data GENERATE
        $0,
        IsMap($1) ? FLATTEN($1) : $1;