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

时间:2011-01-13 17:06:58

标签: hadoop apache-pig

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

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

我现在要对此进行转换,以便将z设置为NULL x > y,并将结果数据集存储为B

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

有简单的解决方案吗?

4 个答案:

答案 0 :(得分:2)

此问题在此JIRA中进行了跟踪: PIG-1693需要在foreach中指明“以及所有其他字段”

目前我不知道做什么比做你说或不加载Z和用star expression添加新列Z更简单。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

“新Apache Pig 0.9功能 - 第3部分”文章中的更多细节:http://hortonworks.com/blog/new-apache-pig-0-9-features-part-3-additional-features/

要解决您的具体问题,您可能需要使用FILTER和UNION来组合结果。

答案 3 :(得分:0)

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

在两个已知列之间更新mycol

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

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