如何将 Pig 元组拆分为子元组?

Posted

技术标签:

【中文标题】如何将 Pig 元组拆分为子元组?【英文标题】:How can I split a Pig tuple into subtuples? 【发布时间】:2013-08-12 15:38:33 【问题描述】:

这是我在 Pig 脚本中处理的元组:

DUMP A
(4,20,53,31)
(21,3,40,16)
(15,51,12,3)

我会将这个关系 (A) 转换为另一个关系 (B),例如:

DUMP B
(4,20)
(4,53)
(4,31)
(21,3)
(21,40)
(21,16)
(15,51)
(15,12)
(15,3)

这意味着保留所有元组中的第一个字段并按每个字段获取一个元组。在前面的示例中,每个元组必须提供 3 个新元组。我有一个解决方案:

DUMP B
(4,20)
(21,3)
(15,51)
(4,53)
(21,40)
(15,12)
(4,31)
(21,16)
(15,3)

这是一个好的结果,但顺序错误(我每次都使用 FOREACH 运算符)。我可以通过向每个元组添加一个字段然后使用 ORDER 运算符来获得正确的顺序,但我认为有一种更简单的方法。

有什么想法吗?

谢谢。

【问题讨论】:

【参考方案1】:

你可以这样做:

-- T is the name of the tuple, and v[1-4] are the values in the tuple
B = FOREACH A GENERATE T.v1, FLATTEN(TOBAG(T.v2, T.v3, T.v4)) ;

如果值没有名称,您也可以这样做:

B = FOREACH A GENERATE T.$0, FLATTEN(TOBAG(T.$1, T.$2, T.$3)) ;

输出:

(4,20)
(4,53)
(4,31)
(21,3)
(21,40)
(21,16)
(15,51)
(15,12)
(15,3)

【讨论】:

以上是关于如何将 Pig 元组拆分为子元组?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用子元组从元组创建列表?

使用 pig,如何将混合格式的行解析为元组和一袋元组?

使用元组进行 Pig 编程

在 Pig 中投影分组元组

多个元组作为用 Java 编写的 pig UDF 中的输入

如何检查元组是不是包含 Apache Pig 中的元素?