如何在Pig中合并地图

时间:2018-03-20 19:08:58

标签: hadoop merge apache-pig

我是猪新手,所以请耐心等待。我有两个具有相同模式的数据源:属性映射。我知道某些属性将具有单个可识别的重叠属性。例如

录制A {"Name":{"First":"Foo", "Last":"Bar"}, "FavoriteFoods":{["Oranges", "Pizza"]}}

记录B {"Name":{"First":"Foo", "Last":"Bar"}, "FavoriteFoods":{["Buffalo Wings"]}} 我想合并Name上的记录,以便:

合并 {"Name":{"First":"Foo", "Last":"Bar"}, "FavoriteFoods":{["Oranges", "Pizza", "Buffalo Wings"]}}

UNIONUNION ONSCHEMAJOIN不会以这种方式运作。是否有可以在Pig中执行此操作的方法,或者它是否必须在UDF中执行?

类似的东西:

A = LOAD 'fileA.json' USING JsonLoader AS infoMap:map[];
B = LOAD 'fileB.json' USING JsonLoader AS infoMap:map[];

merged = MERGE_ON infoMap#Name, A, B;

1 个答案:

答案 0 :(得分:1)

即使是稍微复杂的数据转换,Pig本身也非常愚蠢。我觉得你需要两种UDF来完成你的任务。第一个UDF需要接受一个映射并创建一个唯一的字符串表示形式。它可能像地图的散列字符串表示(让我们称之为getHashFromMap())。该字符串将用于连接两个关系。第二个UDF将接受两个映射并返回一个合并的映射(让我们称之为mergeMaps())。您的脚本将如下所示:

A = LOAD 'fileA.json' USING JsonLoader AS infoMapA:map[];
B = LOAD 'fileB.json' USING JsonLoader AS infoMapB:map[];

A2 = FOREACH A GENERATE *, getHashFromMap(infoMapA#'Name') AS joinKey;
B2 = FOREACH B GENERATE *, getHashFromMap(infoMapB#'Name') AS joinKey;

AB = JOIN A2 BY joinKey, B2 BY joinKey;
merged = FOREACH AB GENERATE *, mergeMaps(infoMapA, infoMapB) AS mergedMap;

这里我假设您要合并的属性是地图。如果这可能会有所不同,那么首先需要将UDF变得更通用。它的主要目的是获得属性的唯一字符串表示,以便可以在其上连接数据集。