我有几个pig
别名:
a: {f1: long,f2: float}
b: {f1: long,f2: float}
c: {f1: long,f2: float}
每个只包含一个记录(它们由 foreach (group ... all) generate ...
创建)我想通过将以上内容合并为一个来创建一个“总摘要”别名(使用 JsonStorage 存储
并使用 hadoop fs -get
收集,然后加载到 Python 中...)
为此我愿意
grand = CROSS a b c;
我明白了
grand: {a::f1: long, a::f2: float,
b::f1: long, b::f2: float,
c::f1: long, c::f2: float}
但是,我更愿意得到
grand: {a:{(f1: long, f2: float)},
b:{(f1: long, f2: float)},
c:{(f1: long, f2: float)}}
这样 json.load()
加载的 python dict 将具有字典值,而不是扁平的。
我该怎么做? 值得付出努力吗? 它甚至有意义吗?
最佳答案
正如您所发现的,CROSS
只是连接了所有组成关系的字段。如果您希望它们装在袋子里,您有两种选择。
第一个有点笨拙,但即使您正在CROSS
ing 的关系中有多个记录,它也适用于您。您可以在之前的 GENERATE
语句中使用 TOBAG
内置 UDF,使您的每条关系记录都包含一个包含所有字段的包。
或者,您可以使用 COGROUP
运算符。只需使用一个虚拟组值,然后将其丢弃:FOREACH (COGROUP a BY 1, b BY 1, c BY 1) GENERATE a, b, c;
。这应该给你你正在寻找的模式。只有当您知道 a
、b
和 c
每个都只有一个记录时,这个才有意义。
关于json - 为什么 Pig 中的 CROSS 会使数据变平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23997570/