json - 为什么 Pig 中的 CROSS 会使数据变平?

标签 json hadoop apache-pig

我有几个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 只是连接了所有组成关系的字段。如果您希望它们装在袋子里,您有两种选择。

第一个有点笨拙,但即使您正在CROSSing 的关系中有多个记录,它也适用于您。您可以在之前的 GENERATE 语句中使用 TOBAG 内置 UDF,使您的每条关系记录都包含一个包含所有字段的包。

或者,您可以使用 COGROUP 运算符。只需使用一个虚拟组值,然后将其丢弃:FOREACH (COGROUP a BY 1, b BY 1, c BY 1) GENERATE a, b, c;。这应该给你你正在寻找的模式。只有当您知道 abc 每个都只有一个记录时,这个才有意义。

关于json - 为什么 Pig 中的 CROSS 会使数据变平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23997570/

相关文章:

java - 使用 Jackson 在 Java 中使用不同的 POJO 反序列化 JSON 数组

javascript - 如何在 javascript 中解析 UI 端的 JSON (key ,value) 字符串

hadoop - 如何以编程方式确定 Pig 执行模式

javascript - AngularJS Controller 内的数组未初始化

ajax - ChartJS 的条形图不渲染

hadoop - Hadoop 中的映射器输入键值对

azure - Cloudera on cloud (Azure) 架构说明

SQL 2016 PolyBase 计算下推到使用 WASBS 又名 Azure Blob 的 Hadoop HDI

hadoop - 通过 java 和 grunt 执行 PIG 脚本

hadoop - pig 拉丁文的汇总信息和预测