如何在pig中合并Map

dl5txlt9  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(383)

我对Pig不熟悉,所以请容忍我。我有两个具有相同模式的数据源:属性Map。我知道有些属性会有一个可识别的重叠属性。例如
记录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;
6xfqseft

6xfqseft1#

当涉及到稍微复杂的数据转换时,pig本身是非常愚蠢的。我觉得你需要两种自定义项来完成你的任务。第一个udf将需要接受一个map并为它创建一个惟一的字符串表示。它可能类似于Map的哈希字符串表示(我们称之为gethashfrommap())。此字符串将用于连接这两个关系。第二个udf将接受两个Map并返回一个合并的Map(我们称之为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;

这里我假设您要合并的属性是一个Map。如果这可能会有所不同,您首先需要将自定义项变得更通用。它的主要目的是获得属性的唯一字符串表示形式,以便可以在该属性上连接数据集。

相关问题