gpt4 book ai didi

hadoop - 如何在 Pig 中合并 map

转载 作者:可可西里 更新时间:2023-11-01 16:37:22 26 4
gpt4 key购买 nike

我是 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;

最佳答案

即使是稍微复杂的数据翻译,Pig 本身也非常笨。我觉得你需要两种 UDF 来完成你的任务。第一个 UDF 需要接受一个映射并创建它的唯一字符串表示。它可能就像 map 的哈希字符串表示(我们称之为 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;

这里我假设你想要合并的属性是一张 map 。如果这可能会有所不同,那么您的第一个 UDF 将需要变得更加通用。其主要目的是获取属性的唯一字符串表示形式,以便可以在此基础上连接数据集。

关于hadoop - 如何在 Pig 中合并 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49392376/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com