如何根据数据类型制作 Apache Pig FLATTEN?
How can you make Apache Pig FLATTEN based on data type?
我有一大组数据,字段为 id
和 details
。 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 的 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() : ;
我有一大组数据,字段为 id
和 details
。 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 的 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
用法类似于以下内容:
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() : ;