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



我有一大组数据,字段为iddetails.details要么是一张地图,要么是一袋地图。我的最终目标是为数据中所有地图中的每个条目输入id, key, value

0.16我可以自由地使用FLATTEN来确保每行只有一张地图,然后使用 UDF 来展平地图。但自0.17年起,FLATTEN也适用于地图。这导致在一次使用后,我完全按照我想要的方式获得了一些数据,但其余数据仍在地图中。

从本质上讲,我需要对一半的数据使用一次FLATTEN,对另一半数据使用两次。有没有办法检测GENERATE语句中的数据类型,以便仅在数据是地图时展平数据?

为了说明,给定

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

我想生成

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

你基本上需要一个UDF,它会告诉你它的输入是否是一个有效的映射。使用这样的 UDF,您可以设置一个三元操作,仅当特定字段是有效映射时才FLATTEN。Mozilla的Akera拥有您正在寻找的确切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;

最新更新