如何引用pig输出中的列

Posted

技术标签:

【中文标题】如何引用pig输出中的列【英文标题】:How to refer to the columns in pig output 【发布时间】:2013-11-07 19:53:46 【问题描述】:

我有一个包含以下值的数据文件:

A 1
B 2
C 3
C 3

我写了以下猪脚本。

A = load 'users.txt' as (usr: int, nod: int);
B = GROUP A BY usr;
C = FOREACH B GENERATE group,COUNT(A);

现在,我想使用输出 C 并进一步处理它。如何引用 C 中的值/列?我尝试转储数据,但它们以键值对的形式出现?我是否需要将此输出写入文件,再次加载并处理?

谢谢, TM

【问题讨论】:

附注,根据您当前的架构,您将在 'column : usr' 中获得 NULL 值,因为您将其定义为 'int' 并且您有字符串值。 【参考方案1】:

在以下列方式创建列时为其命名:

C = FOREACH B GENERATE group as usr,COUNT(A) as countA;

然后可以通过这些名称来引用它们,如下例所示:

D = FOREACH C GENERATE usr, countA;

【讨论】:

...非常感谢...轻而易举地工作...这看起来很像 SQL 别名...它们在 PIG 中是否也被称为相同的名称? @user295338 是的,据我所知,它们基本上是一样的。【参考方案2】:

如果为列命名很麻烦,例如,如果您有大量列,您还可以通过零索引列号来引用列。与 Davis Broda 发布的代码等效的代码如下所示:

 C = FOREACH B GENERATE group,COUNT(A);
 D = FOREACH C GENERATE $0, $1;

【讨论】:

虽然这是真的,但我不能足够强烈地反对这种做法。它导致难以维护的不可读代码。始终命名您的字段。如果您经常使用的数据源中有很多字段,请创建一个宏来为您命名。 我当然同意。但这仍然有有价值的用例,因为有时您不会编写脚本/软件来维护。有时您只想回答一个关于数据的快速问题。如果您正在编写应该可维护的 Pig,我建议首先使用像 Avro 这样的序列化框架,而不是使用 Pig 特定的命名宏。

以上是关于如何引用pig输出中的列的主要内容,如果未能解决你的问题,请参考以下文章

如何从存储过程的表中的列中获取输出参数

从另一个工作表的列中的工作表列中搜索每个值,如果找到,则将整行粘贴到输出中

无法使用 Pig 中的 Elephant Bird 访问带有包和元组的嵌套 JSON

如何检查numpy矩阵的列中的所有值是不是相同?

如何在 PySpark 中的 RDD 中的列中查找标准差

在另一列中使用一列中的值