我有几个pig
别名:
a: {f1: long,f2: float}
b: {f1: long,f2: float}
c: {f1: long,f2: float}
每个只包含一条记录(它们由foreach (group ... all) generate ...
创建),我想通过将上述内容合并为一个别名(为stored using JsonStorage
并使用{{hadoop fs -get
来创建“大摘要”) 1}}然后加载到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将具有字典值,而不是平面值。
我该怎么做? 值得努力吗? 它甚至有意义吗?
答案 0 :(得分:1)
正如你所知,CROSS
只是连接所有组成关系的领域。如果你想让它们装在袋子里,你有几个选择。
第一个是有点笨拙,但即使你CROSS
的关系中有多个记录,它也会对你有用。您可以在之前的TOBAG
语句中使用GENERATE
内置UDF,以使关系的每条记录都包含一个包含所有字段的包。
或者,您可以使用COGROUP
运算符。只需使用一个虚拟组值,然后将其丢弃:FOREACH (COGROUP a BY 1, b BY 1, c BY 1) GENERATE a, b, c;
。这应该为您提供您正在寻找的架构。只有当您知道a
,b
和c
每个只有一条记录时,才有意义。