5

想象一下,我可以使用下表:

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

我现在想转换它,将z其设置为NULLwhere x > y,并将结果数据集存储为B.

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

有简单的解决方案吗?

4

4 回答 4

2

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

目前,我不知道有什么比按照您所说的或不加载 Z 并添加带有星形表达式的新列 Z 更简单的事情了。

于 2011-01-14T17:06:17.413 回答
0

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

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

于 2011-01-18T18:27:17.620 回答
0

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

结果 = 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 来组合结果。

于 2014-05-30T14:54:57.107 回答
0

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

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

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

aliasAfter = FOREACH aliasBefore GENERATE 
             .. colBeforeMyCol, updatedvalue, colAfterMyCol ..;
于 2016-08-19T14:28:47.443 回答