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

How can you make Apache Pig FLATTEN based on data type?

我有一大组数据,字段为 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)

您基本上需要一个 UDF,它会告诉您输入的地图是否有效。使用这样的 UDF,仅当特定字段是有效映射时,您才可以将三元运算设置为 FLATTEN。 Mozilla 的 Akela 具有您正在寻找的确切 UDF 等许多其他东西。您可以在 https://github.com/mozilla-metrics/akela and the UDF of interest at https://github.com/mozilla-metrics/akela/blob/master/src/main/java/com/mozilla/pig/filter/map/IsMap.java

找到 Akela 开源存储库

用法类似于以下内容:

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

data = LOAD '<path_to_data>';

dataFlattened = FOREAH data GENERATE
        [=10=],
        IsMap() ? FLATTEN() : ;