想象一下,我可以使用下表:
A: { x: int, y: int, z: int, ...99 other columns... }
我现在想转换它,将z
其设置为NULL
where x > y
,并将结果数据集存储为B
.
而且我想这样做而不必明确提及所有其他列,因为这将成为维护的噩梦。
有简单的解决方案吗?
想象一下,我可以使用下表:
A: { x: int, y: int, z: int, ...99 other columns... }
我现在想转换它,将z
其设置为NULL
where x > y
,并将结果数据集存储为B
.
而且我想这样做而不必明确提及所有其他列,因为这将成为维护的噩梦。
有简单的解决方案吗?
我可以通过将它们嵌套在单排袋中并在之后展平来减少一些柱膨胀。
不过,这感觉有点像黑客。所以我也在研究级联,看看它是否更适合我的场景。
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 来组合结果。
当然,您可以按列号选择列,但如果您更改任何内容,这很容易成为一场噩梦。我发现列名更加稳定,因此我推荐以下解决方案:
您可以使用..
来指示前导列或尾随列(或列之间)。如果您想将 'MyCol' 的值更改为 'updatedvalue',这将如何解决。
aliasAfter = FOREACH aliasBefore GENERATE
.. colBeforeMyCol, updatedvalue, colAfterMyCol ..;