如何使用猪拉丁语“更新”列

Posted

技术标签:

【中文标题】如何使用猪拉丁语“更新”列【英文标题】:How to "update" a column using pig latin 【发布时间】:2011-01-13 17:06:57 【问题描述】:

假设我有以下表格可供使用:

A:  x: int, y: int, z: int, ...99 other columns... 

我现在想对此进行转换,将z 设置为NULL,其中x > y,将生成的数据集存储为B

我想这样做而不必明确提及所有其他列,因为这将成为维护的噩梦。

有简单的解决办法吗?

【问题讨论】:

如果您想出答案,请用答案更新此问题。每当我现在必须做这样的事情时,我都会将 LOAD 行复制/粘贴到 FOREACH 中。我希望我知道一种更清洁的方式。 【参考方案1】:

此 JIRA 中跟踪此问题: PIG-1693 在 foreach 中需要有一种方法来指示“以及所有其他字段”

目前我不知道有什么比照你说的做或不加载 Z 并使用 star expression 添加新列 Z 更简单的事情。

【讨论】:

对不起,我错过了这个答案这么久!【参考方案2】:

我能够通过将它们嵌套在单排袋中并在之后展平来减少一些列膨胀。

不过,这感觉有点像 hack。所以我也在研究级联,看看它是否更适合我的场景。

【讨论】:

【参考方案3】:

Pig 0.9 中添加了一个有助于您的场景的功能。新的项目范围运算符 (..) 允许您通过指示开始和/或结束字段名称来表示字段范围,如下例所示:

result = FOREACH someInput GENERATE field1, field2, null as field3, field4 .. ;

在上面的示例中,field1/2/3/4 是实际的字段名称。其中一个字段设置为空,而其他字段保持不变。

更多详情请参阅这篇“Apache Pig 0.9 新特性 – 第 3 部分”文章:http://hortonworks.com/blog/new-apache-pig-0-9-features-part-3-additional-features/

要解决您的特定问题,您可能需要执行 FILTER 和 UNION 来组合结果。

【讨论】:

【参考方案4】:

当然,您可以按列号选择列,但如果您更改任何内容,这很容易成为一场噩梦。我发现列名更加稳定,因此我推荐以下解决方案:

当 mycol 在两个已知列之间时更新它

您可以使用.. 来指示前导列或尾随列(或列之间)。如果您想将 'MyCol' 的值更改为 'updatedvalue',这将如何解决。

aliasAfter = FOREACH aliasBefore GENERATE 
             .. colBeforeMyCol, updatedvalue, colAfterMyCol ..;

【讨论】:

以上是关于如何使用猪拉丁语“更新”列的主要内容,如果未能解决你的问题,请参考以下文章

两个表之间的猪拉丁计数差异

如何创建用于猪拉丁语和 izzle 翻译的代码以及同时应用它们的代码?

如何从 grunt shell 以猪拉丁语运行宏?

如何在猪拉丁语的日期时间范围内创建缺失的记录

在猪拉丁语中为 foreach 生成一个 id/counter

如何在我的猪脚本中设置多行字符串?