我是猪新手,所以请耐心等待。我有两个具有相同模式的数据源:属性映射。我知道某些属性将具有单个可识别的重叠属性。例如
录制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"]}}
UNION
,UNION ONSCHEMA
和JOIN
不会以这种方式运作。是否有可以在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;
答案 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变得更通用。它的主要目的是获得属性的唯一字符串表示,以便可以在其上连接数据集。